Advice for a {relatively} newbie programmer?

(David O'Dea) #1

Hi All!
I am soon going into my second year of a computer science degree at University. Whilst my coursework is engaging and informative (first Year classes included C programming, Algorithms, Computer systems, Math, Physics, Information systems as well as a he usual other CS subjects) I feel at times that things can be a bit stale and the pace a bit cumbersome.

My real interest is in developing engaging and useful web apps (Discourse for example). Whilst I do realise that a grounding in fundamental CS knowledge can be most useful in building broad reaching and efficient apps, I sometimes wonder if a 4 year degree is “overkill” …

With the advent of online {free/paid} resources now available for learning to code, my questions is what route would the community reccomend to someone in my position who does not have any ambition {at this moment at least} to become me another number banging out units tests and anonymous code for multinational company X.

I realise my question is rather broad in scope but any discussion would be most appreciated.

(James Kiesel) #2

First off, you’re very lucky to be acquiring these skills at this time. There’s no better time to be a young programmer (until next year, at least) Whatever happens, you’re not going to starve; even really bad programmers can pay the rent (and more). This grants you the luxury of pursuing a passion [PS: building web apps isn’t a passion - making people communicate together with civility is a passion] with relatively little risk (because if all else fails, you’ll be able to go get the well-paid job for a while to cover it up.)

I think being in college or not is a bit moot; get the best skills you can, meet the most value-aligned people you can, build the coolest crap you can come up with, and remember that even after horrible failure, your skills are still going to be sought after (likely even more than they were before your horrible failure)

also… contribute to open source. :+1:

(Sam Saffron) #3

Some ideas:

  • Attend 1-2 tech meetups every month, if you are interested in contributing to Discourse find the Ruby and JavaScript meetups.

  • Set up a working dev environment, being up and running with a development environment is the biggest barrier to contributing to open source.

  • Use the software you want to help improve, a lot. Don’t go hunting for little bugs to start out with, a much better use of your time is using the software. If you are looking at improving Discourse, participate actively for at least 1-2 weeks in a Discourse community. By using the software you will find your most painful itches you want to scratch.

  • Being a good programmer is not only about “pushing code”. Reading code, reasoning about code, debugging, profiling, thinking about problems and how they map to the real world is the majority of what I do all day. The coding part is just a component of your job.

  • Consider building your own little project / tool that you love using, in the Discourse context it could be a plugin.

  • Be tenacious. To me the biggest thing that separates the better programmers from the less “better programmers” is tenacity, not “natural talent”.

  • Aim at finding a mentor. There is huge value in having someone to guide you early on in your career. Google summer of code is a good way of finding a mentor, there are many similar programs.

(David O'Dea) #4

Many thanks @gdpelican && @sam for taking the time to respond :thumbsup:

(Jeroen Heijmans) #5

Good question! Even better that you thought of asking it. Wish I had asked it while in college.

First things first, here are some things no one told me about in college, when I now wish they would’ve (more or less in order of importance):

  • Version control. Yes, wow, but I had very theoretical CS type classes, and not one of them included this basic thing. Version control systems are very important to software dev. Preferably start with a Distributed VCS like Git or possibly Mercurial. Big alternatives are SVN and TFS. (From the tone of your question I think you already knew about this, but I’m including it anyways as it’s very important.)
  • Unit testing or Test-Driven Development. Again, no-one told me about this in college, and I wish they would’ve at least mentioned it so I could dive into it myself.
  • Continuous Integration. You don’t need to become an expert in this, but having some kind of automated build system is nearly mandatory for professional projects. You’ll also have some (or a large) degree of automation when contributing to open source, at the least in the form of build automation. At least be aware of this and gather basic knowledge about it.

Those are without a doubt the top three things I wish I’d learned about in college.

Next, let me (re)mix some of the things mentioned in more detail earlier in this thread with some of my own advice, regarding softer skills:

  • Find a mentor as @sam mentioned.
  • Contribute to open source as @gdpelican mentioned. Or, similar, get your pet / hobby project out there, e.g. on Github.
  • Find any way to work together with folks on stuff. Open source is one way, but typically college will also have cooperative assignments. Find a partner that is also interested in doing a fare share of work, and if this person is less skilled than you resist the urge to “do all the work”: teaching others new things, going at their pace, pair programming (and actually sharing the keyboard, even if the other is slower) is very important.
  • Teach! Find lesser skilled people and teach them how to do things. If you really want to become good at something you’ll have to try to teach it. This can be done in many ways: answer questions on Stack Overflow, find a local community (e.g. young kids trying to learn to code), peers, whatever suits your situation.
  • Ask! Use Stack Overflow, Google Groups, mailing lists, or whatever you personally prefer to ask clear questions. Being able to provide total strangers with a repro of your issues will help you learn to debug code and find root causes: an essential professional skill.
  • Reinvent the wheel, but be aware when you’re doing so. I’ve “invented” my own CSV standard and thought myself to be quite clever at that too, at a time when there were very similar technologies out there. You’re learning in an age when Google is close, so if you feel you’re solving a “basic” problem: search and ask a lot whether this hasn’t been done before.
  • Learn about Agile Development or perhaps a particular type of Agile like Scrum. Even if you may not land in a project using it, there’s many useful / common-sense-style advice in those methodologies, and it helps understand where your to-be colleagues may be coming from.

Then finally, some language-agnostic (but consequently somewhat aimed at soft(er) skills) book suggestions that I personally loved and helped me a lot:

  • The Pragmatic Programmer by Andrew Hunt and David Thomas
  • Design Patterns: Elements of Reusable Object-Oriented Software by Gamma et al
  • The Mythical Man-Month by Fredrick Brooks
  • Domain-Driven Design by Eric Evans
  • Clean Code and The Clean Coder, both by Robert C. Martin

A (dis?)honorable mention is for “Code Complete 2”: a lot of folks would recommend it, but personally I’d skip it. Up to you.

In closing, some less serious resources:

But in any case, let me reiterate: I salute you for asking this question. You must be on your way to the top! :smiley:


Step 0: Stay in school. It might seem boring or like overkill now, but it’s going to be one of the most effective ways to learn the more advanced topics you need to avoid becoming “another number banging out unit tests”.

Step 1: Start small. You say you want to build web apps like Discourse. Have you created a basic html hello world homepage? How about an online portfolio of some kind?

Step 2: Iterate, but take small steps. Once you have that basic html homepage, maybe try adding some JavaScript. Try out something like Processing.

Step 3: Have fun. Participate in game jams like Ludum Dare and One Game a Month. If you’re not into games, that’s fine too: what sounds like a fun project? Again, start small and iterate in small steps. Give yourself projects that take days or weeks, not months or years. Add to that online portfolio you created in step 1.

The people telling you to get involved in open source projects aren’t really wrong, but it can be hard for a novice to know exactly how to jump into something like that. You might be better off getting your own creative juices flowing by giving yourself small projects to work on.

(Henrik Berg) #7

By dev environment, do you mean the correct programs? Could you explain in further detail?

(Sam Saffron) #8

I mean, in the Discourse context, set up an environment that allows you to run the unit tests for Discourse and be able to run Discourse in development mode.

In the context of something like Docker, it would be and environment that allows you to compile and test Docker and so on.

(Angus McLeod) #9

I would suggest that you focus on learning Mathematics more than any single CS discipline. Programming languages and structures will come and go. Mathematics will always be around. I’ve found that those skilled in mathematics can learn most CS disciplines quite easily. Focusing on Mathematics also gives you more choices if you ever decide you want to change careers.

I’m not a programmer (although I can code). I’m a product manager in a startup. I used to be a lawyer. Coming from a completely different discipline, I would say two things have helped me the most:

  1. Read the manual and try to solve a problem yourself before you Google the answer (or ask for help). This is true of anything you want to learn in any discipline, but particularly pertinent for programming when you have Stack Overflow at your fingertips. Training yourself to reason from the fundamentals is harder in the short term but far more rewarding in the long term. No one is a saint in this respect, but it’s true nonetheless.

  2. Don’t…give…up. Particularly if you’re in (or want to work in) a startup, you will face many problems that seem intractable or just beyond your abilities. A function that will just not work (for the 50th time). A founder or colleague who drives you up the wall. If you can keep your head and just keep going, you will find a way. It sounds corny, but ‘tenacity’ is probably more important than any piece of knowledge you will learn.


In a general sense: can you go to your computer right now, write a program, and run it?

If not, then that’s your first step. Choose a language. Set up your IDE. Get everything you need installed. Write a simple hello world application. Go from there.

(Ben) #11

Create something. Pick a project that you are passionate about, and have fun creating it. You will learn more about programming that you’d ever imagine. Don’t be afraid to Google. Make sure you pick a language that you like. When you feel finished with your project, do something new. You’ll have fun, and learn exactly what you need.

(Erlend Sogge Heggen) #12

Just discovered How to be a Programer on GitHub. Seems like a good resource.