I’m a student, what [language, framework, API, concept] should I learn?

Part one of a continuing series.

There are two ways to learn something. The first way is to learn from another’s advice [the easy way], and then there is the hard way [through experience and making mistakes]. When starting out in a Computer Science degree, learning the material and concepts will require a lot of effort. [the hard way] It’s not a wrong way to go about it. The hard route helps to reinforce the material. However, not everything in your journey to become a software developer has to be difficult.

One of the most frustrating things for a student, when in a Computer Science program, is producing a deliverable to submit. Many students, outside of the introductory course, quickly find out that a few quick hacks won’t get the highest grade available. Many professors require documentation, specific file layouts, compliable code, funky submission instructions, build instructions, shout-outs in the comments (1), or even coding conventions. These extra/non-technical requirements add to more complexity and make assignments more difficult. However, they do have merit and “build” the student’s technical character. In academia, there are very few courses in the US that will teach the tools of the trade, this is something that the student is left to learn on his or her own.

So what does this have to do with answering the question: What should I [as a current Computer Science student] learn? Build systems. Learning how to consume a web service to Facebook or writing the next twitter client is great, however learning how to use a build system will make your professor’s, and your life much easier. A build system is an external tool [usually separated from an IDE] that defines the instructions on how to build an application. In addition, it makes your life easier when questioning if your attempt was worthy enough to submit. Did the build system pass and produce a deliverable? If you have all of the rules and unit tests configured to run, the answer is easy… Yes! Once you are confident that the assignment was completed to satisfaction, you can go party err study ‘social algorithms.’

So let’s imagine that you have the following requirements from a professor:

  • Build a chat system [One client, and one server]
  • Include unit tests for every method used
  • Include Java Doc
  • Email to: professor@university.com
  • FTP The resulting zip file to: ftp server.
  • Create a readme at the base, and include your name and the word “Screaming Monkeys” within the readme file.
  • Include instructions on how to build your software
  • Use the following file format:
    • /
    • Readme
    • BuildDoc
    • Doc/
    • Source/Client/*….
    • Source/Server/*…
    • Binary/*…

Building a working chat client and server solution may be difficult for someone that has just learned about sockets and lacks experience. The non-technical requirements could become overwhelming. However the assignment never required all of the non-technical instructions to be performed manually. I have NEVER heard of a professor that will take points off for using these tools. If anything, using a build tool will improve your grade. It allows for you to plan for these requirements ahead of time, and let software handle the rest for you.

“But hey! That looks like a lot of work to do a few simple steps!” You’re right; all of those steps can be performed manually and probably quicker. However, if you screw up part of your final deliverable [code doesn’t compile, you forgot a unit test, or the code conventions weren’t followed], you’ll have to perform all of those menial tasks all over again. With all of those tasks, Ant can perform those automatically by just typing in “ant.” You can configure ant to build the software, run all of the unit tests [and stop the build if one fails], configure the output of the java doc, run utilities [to confirm that your name is there, and the “special word”], perform all of the file manipulation and deliverable locations, and even submit the result [ftp, email, source control]. If there is an ant task for the action, you can use ant to do it.  Another benefit is that it can even run the source code through a “coding convention” checker. Have a professor that requires you to use the K&R coding convention? No problem, just add a check or reformator in the build environment. Problem solved.

In summary, assignments in computer science are difficult with the shear amount of demands. Reduce the potential for mistakes by automating the tedious tasks. Learn a build system early in your education. It will help ensure consistency in your code, get rid of annoying non-technical requirements, and make your work a lot simpler.

Need another reason? Do it for getting a job after you get out of school. There are very few students that have even used a build system prior to entering the work world. Most students entering the work world have to learn at least one build system as soon as they start their first job. The software industry thrives on build systems. If they aren’t working, the developers are unable to progress. Hey, worst case scenario: Let’s assume that you’re not a very good CS student, and you barely pass with your CS degree. If you know a build system extremely well, you can still proceed with a career of being a “Build Systems engineer.” Those guys can still make quite a lot of money. [Indeed claims that a build engineer starts at $50k and has a sizable amount of jobs that will earn $130k+ a year]

Some of the build systems that are currently in use:

  • Ant [Good for nearly every language out there]
  • MSBuild [Good for the MS supported language (VC++, VB?, anything .NET)]
  • Maven
  • Gradle
  • Make [Good for C++, and bash]
  • Apache Ivy

(1)    In my prior work as a teaching assistant I am guilty for supporting the shout-outs rule. The requirement was for the student to include his or her name in the top of the file. This was mentioned on the grading rubric (included in the assignment writeup/specs).  It’s a simple request to complete, and it makes the grader/professor’s life a lot easier. It’s akin to asking elementary school children to write their name on top of the assignment. A lot of new students don’t add their name to their code.

  • http://antipaucity.com Warren

    A related, timely blog entry - 
    http://blog.jeffreymcmanus.com/1924/more-universities-should-shut-down-their-computer-science-programs/

    When you combine this with the freebie courses available via MIT’s OCW, Coursera, Udacity, and myriad others – I wonder what the *actual* purpose of a CS degree even is anymore

    • crash025

      There are somethings you require inperson mentoring on the subjects. Never discount the use of non-verbal communication, and subtle voice clues that are often eliminated from audio/video.

      Also, don’t forget the ability to meet others that are going into the industry.

      • http://antipaucity.com Warren

        True, some in-person mentoring is fantastic – and needed. However, for the majority of topics, self-paced study is at least equivalent (if not better) than formally-paced learning environments: presuming, of course, you are motivated.

        Formal pacing is fantastic to help motivate people (eg that test is issued on Friday, and no make-up exam is offered, or the final project is due on 15 May – no late submissions accepted).

        One problem I see with this, though, is that in many ways college merely proves you can jump through a series of hoops, do what you’re told, and put up with 4 years of BS so you can get a BS. The guy who got a 2.1 GPA graduates just the same as the one who earned a 3.8 – they both have degrees, from the same university, and to a potential employer look “identical” (unless you look at the transcript, but even then – they may both have 3.0 averages in their major whilst dude A nearly flunked everything else but dude B passed / did well-or-even-better in his non-major classes).

        FTR – I don’t think this applies *only* to compsci and like – it’s true for the majority of degree programs available.

        What types of programs really do require all the book time and teacher involvement? Medical professions possibly, pharmacists potentially (though a motivated technician could certainly learn what she needed to become a full-fledged pharmacist), and some others – but the vast majority of coursework-initiated programs would be far better done on a self-paced track with on-the-job training.

        As the majority of college graduates find out (sometimes rudely), the majority of what they learned in school has nothing to do with their new job, and the company they go work for is going to “really” train them to do the job.

        The model that seems to work the best is the tried-and-true apprentice approach (eg http://antipaucity.com/2008/05/08/queuing-the-next-generation) – one that one of my former employers (http://shodor.org) utilizes [nearly] exclusively.