“Programmers hardly ever get jealous on encountering “beautiful” code. Instead we admire, we complement and promote. In the midst of this flurry of altruistic feelings, we must continually benchmark our proficiency and will ourselves to higher levels of beautiful code creation. Creating beautiful code is fun.” – Victor Dibia .
“Hi, I am a freshman student, how can I learn to write programs ? I like some of the apps you have designed – how can I learn to develop apps like that ? I am a computer science graduate, but I don’t really have much software development experience – is it too late to learn ? “
Sometimes, I get the above questions from colleagues – especially students that I have had the opportunity to mentor. I have written this post to collate some answers I have given in the past, bundled with some anecdotes. While the overall tone of the post is to provide useful tips and guide students in developing countries towards building up world class proficiency in software development, it should also be definitely useful to ALL students. I must also mention that the article is also fairly subjective as its based off of my own experiences.
Here are my top 8 tips
1. Motivate yourself , Make your CodeVow
So, why do you want to learn how to program ? If you have a clear answer that leaps to mind, that’s awesome! It might be because you have looked into the eye of “beautiful code” and you loved what you saw. Or you appreciate the creative and artistic elements entwined with software engineering. Or you would like to be the next Mark Zuckerberg (which is ABSOLUTELY fine). Or you simply just want to make money. Your reasons may change over time. But you should have a reason, a goal that would propel you during the learning journey.
Prior to commencing my bachelors degree back in 2003, I was in a pre-degree study program and that’s where I met a really smart young man – Remi. Remi’s nick name was pc-guru . Few people had pc’s back then – say 3 students in the entire male dormitory and they were all good friends with Remi. He cloned pc’s , purchased parts (hdds, memory, pci components etc) and could easily troubleshoot/fix ALL issues. ALL. Heck, even the computer lab technician consulted his help in fixing the lab computers! He was also an avid gamer and I remember many hours we all spent crowded around, watching him successfully play and finish the seemingly insurmountable adventure/fantasy game Lara Croft – Tomb Raider. I admired Remi very deeply and learned a lot from him. I remember him explaining to me the differences between serial ports, parallel ports, usb ports , converters and how I could check if an old pc at home could support a USB game pad I was saving up to buy (through him) . I also remember arriving at the computer lab one afternoon and seeing him teach the lab assistant how to write C/C++ code. You see, Remi was a pre-degree student just like me and his major was business administration. I was a computer engineering major and I saw C/C++ code for the first time that day. That same day, I vowed to become a rockstar programmer. I’d read, I’d study, I’ll make out extra time regularly, I’d beg for help where needed .. and I’ll learn to code. CodeVow, Bam!
Generally speaking, the more intrinsic your motivations are, the longer it will last in helping you achieve at your destination. Rockstar programmer.
2. Study to Show thyself Diligent.
Bill and Bruce went into the forest with cutlasses each day to cut down trees. Consistently , Bill cut down 5 trees each day and Bruce cut down just 2. One day, frustrated, Bruce asked Bill what his secret was, given they were of equal stature and strength. Bill replied “After cutting down each tree, I spend half an hour sharpening my cutlass” .
The good book says, study to show thyself approved, a workman who is not ashamed. Similarly, in order to write good code, you MUST study. First, you need to study in order to learn a programming language at the genesis of the entire process. After that you need to keep studying to apprise yourself of latest algorithms, design patterns, frameworks and libraries that incorporate recent technology. Technologies change and languages evolve over time.
Its also important to be practical, thorough and unrelenting in your study. Purchase or download a free book on a modern mainstream programming language of your choice (C, C++, Java) and consume it from cover to cover. Yes, COVER TO COVER. Also, completely code ALL examples and exercises! ALL examples. This will greatly boost your knowledge base, confidence and comfort with code. Be patient with yourself, it takes time.
3. Take on Free Projects – Build your portfolio
When you are starting out, Free is your best friend. Free projects can mean alot of stuff. It can mean a free website for your uncle. A free design banner or website for your school association. Helping out with a friends coding project. Or even contributing to an open source project. Free projects help you build your brand, build your portfolio and build your confidence .
I learned to create designs in Fireworks so I could make posters for my local IEEE student branch where I volunteered. I also created my first “hosted” website in ASP.net and then PHP (IEEE hosting service supports only php) for the local IEEE student branch . And after a year of doing this and gaining some experience, I started to give classes on web design to freshmen students. All for free. I did lots of free stuff and for several years 🙂 . Ofcourse, at some point, doing free stuff should end and when this time arrives, you’ll know it. Your (free) work will have been referred, your satisfied clients will actively advocate for you, and people will be happy to part with money for your services. I remember a team of senior students who’d seen my free work, “hired” me to train them on coding and help them build some part of their final year project.
Also, as a programmer/developer, it is not uncommon for people to ask you “what have you done” . In fact, you will get asked this question a lot! Conversations can end very quickly if you don’t have stuff to show. On the other hand, a solid portfolio of projects will help you establish the credibility you need in order to charge commensurate fees for your output. These tips on when to work for free by Seth Godin are useful, should you become indecisive on when to charge or not.
Free or paid ? And when you find yourself in competition with those who do it for free, your approach should be simple – Create something that is better than free. Seth Godin aptly describes the situation in his blog post – Better than free
There’s only one way: Sell something better than free.
Make a product or provide a service that’s worth paying for.
You don’t need a better way to talk about what you do, or a better gimmick, or a better social media strategy. In fact, you need to reinvent and rebuild what you make for a new reality, a reality where paying for something is an intentional act of buying something way better than the free alternative.
I’m sorry if this seems obvious. It’s apparently not obvious to all the frustrated people I encounter who are still trying to sell the old thing in a new market.
4. Benchmark Yourself – Reverse Engineer
By bench-marking, I mean comparing your output with the best out there. Whenever I start a new project (graphic design, web app, mobile app), I usually perform a simple Google search on the project title to see how other programmers and designers have implemented it. Whenever I encounter complex designs which I cant seem to fathom, I shamelessly download them (if possible and permitted) and study (reverse engineer) the code. And out of the ashes of several reverse engineered projects, my own projects are born – standing tall on the shoulders of extant experience and comparable amongst its peers . In addition to learning, another reason why you should benchmark is to avoid re-inventing the wheel. I remember writing complex Ajax calls with lots of lines of code , almost implementing my own (inefficient) mini-JQuery library, before I found JQuery. And examine how your projects compare with best practices. Are your websites responsive ? Are you implementing HTLM5 to keep your interface lighter and faster ? Are you implementing analytics? Are your website tags compliant with standards ? Do your websites have well structured keywords ? Are your websites designed for easy navigation and accessibility? Are your game app graphics smooth and animations fluid ? Are your fonts as visually appealing ? etc .
5. Participate in Hackathons and Challenges
Hackathons and Coding Challenges are coding events setup by large organisations where developers build software, solve problems and win prizes. They are opportunities to build up your portfolio, learn new technologies, meet other developers, earn cash/devices (and other cool prizes), get introduced to the community and build your reputation. We all have ideas that we want to implement and a Hackathon can become an excellent avenue to build such ideas into products. Many times, the benefits are cascading.
You win a Hackathon -> Your reputation grows -> You get invited for more Hackathons -> You get offered more paid projects -> You gain more experience -> You make more money (hopefully) .
One of my first Hackathons was at Gnigeria 2012 . There was a html5 hackathon session where code labs where given, and skeleton code provided. That day, I was lucky to correctly solve the codelabs and went home with a Samsung Galaxy S2. I still use it till today. I also remember reading a Anthony Rizk’s book on blackberry development in a hurry and cranking out a winning conference app on the blackberry java platform during the Mobile Web West Africa 2012 conference. Both hackathons were instrumental to me getting the opportunity to teach at the MIT / Google Accelerating Information Technology Initiative at University of Lagos , Summer of 2012, getting invited to speak at the Mobile Entertainmen Africa Conference and also speaking at the Blackberry Live 2013 Conference . Such events inspire me to be the best I can be and to take advantage of such opportunities whenever they present themselves . To learn more about hackathons, please follow your local community technology news outlets /blogs or visit sites such as www.hackathon.io or challengepost.com for info on general hackathons/challenges.
6. Code to Solve Problems – Study and get good with Algorithms and Data Structures.
As good programmers, we must be adept at problem solving. This requires we be excellent at clear logical thinking. This then requires ability to draw on well-exercised analytical thinking . Normally, this is NOT a natural trait. It needs to be learned and exercised. If your bachelors degree is in computer science, you might have had the opportunity to take a class in data structures, and algorithms. Ensure you pay extreme attention and solve lots of problems independently. To give a clear example, if you do not know (or are not sure of) what the following mean, then your algorithms background is in need of some extra brush up : Quicksort, BubbleSort, HeapSort, MergeSort, Insertion Sort, External Sorting . Your data structures will need help also if you cannot implement a binary tree, heap, stack , queue, priority queue, linkedlist, tree, and graph.
Consider the problem below ? How long does it take you to implement a working solution ? Happy to learn about and discuss your solutions in the comment section below.
Assume you have a method isSubstring which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubstring (i.e., “waterbottle” is a rotation of “erbottlewat”).
In my opinion, being able to solve challenging algorithmic problems like the one above in a methodological precise manner is a clear demonstration of “analytical thinking” – which almost everyone seems to have on their resumes these days.
I did complete a bachelors degree in computer science and never got the chance to take a course in Algorithms (unfortunately there was none offered!!) . So, in my free time, I practice algorithms. I primarily use Project Euler for my personal study and hope to ride on to TopCoder when I exhaust the projecteuler stash of problems. And oh .. this section wont be complete without mentioning that Software Engineering Job/Internship interviews with multinational IT companies like Google, Yahoo, Microsoft, Facebook, Amazon (where we all want to work) are usually made up of algorithms and data structure questions.
7. Practice Deliberately – Never Stop Coding !
From time to time, life gets busy .. we go back to school, get a full time (non-coding) job, take an extended break, travel, get married, have a family etc . Every few months, its good to write some code. Learn a new programming language while you are at it too. Most decent programmers I know are usually awesome at one or two language and knowledgeable in about 3+. The importance of deliberate practice cannot be over emphasized. Many people wonder how much effort it takes to become good at your craft. The golden number is 10,000 hours. This article on the bufferblog is laden with practice and perfection inspiration. I encourage you to read it .. here’s an excerpt based on Kobe Bryant’s daily personal practice schedule before Team USA’s regular practice session
For those of you keeping track at home, Kobe Bryant started his conditioning work around 4:30am, continued to run and sprint until 6am, lifted weights from 6am to 7am, and finally proceeded to make 800 jump shots between 7am and 11am.
And he did all of this before the regular Team USA training began. Each day.
800. Jumpshots . (not shots). To this end, I have a personal habit of learning a new programming language or platform every year or so. In recent times its been from making blackberry apps, windows phone apps, android apps , to more recently tizen wearable apps etc. Its also involved learning new frameworks such as Nodejs, Meteorjs and working with data visualization packages and tools. Never stop learning!
Finally – When and where do I start Programming ?
Now. Start right now. I started in my freshman year of college and if you are lucky to start that early … by all means do! With the rise of MOOCs , there are more resources available to help you learn than every before. You may take an online programming class from Udacity such as Introduction to Programming in Java and try to see it through from beginning to end, solving ALL problems. Other platforms include MIT Open courseware, Coursera, CodeAcademy, etc . Select whichever looks cool to you, just get started.
I have been experimenting with programming since 2004, and still have lots to learn. Wishing you best of luck as you start/continue this journey. Got questions or suggestions on more tips to consider when learning to code ? Please drop them in the comments section below.