My oldest son Noah turned 7 three months ago. If he could trade his family for a 2 hour session of playing minecraft, he would do it in a heartbeat. The other love of his life is Super Mario Maker, and it’s been a thrill to see him play the same game and levels that I played when I was his age. About 5 months ago, I left my family for my yearly pilgrimage of ludum dare: a game dev competition during which I lock myself away with friends, return to a state of primitive caveman, not sleep for 48h, and create a full game from scratch. As I proudly showed my revolutionary AAA title to my wife, Noah was naturally intrigued and I introduced him to the world of code, showing him how simple words (he had just learned how to read) produced an actual game. Since that very day, Noah has been asking me repeatedly to teach him how to make his own video games. For the past 5 months, I have been looking for the holy grail of language/IDE for kids in the hope of turning that spark of interest into a memorable experience…
My quest has led me to endless forums, through which I have tried countless suggestions: SmallBasic, Pico-8, Smalltalk, Scratch, etc. I ended up with a disappointing conclusion: nothing is close to what we had back then. 30 years later, QBasic is still the best when it comes to learning how to code.
“OMG please don’t teach him GOTOs!!”
1 2
10 PRINT “OH NO, WHAT ARE YOU DOING?!!!” 20 GOTO 10
Yes, Basic is not considered a great language. It introduces one to harmful concepts, uses awkward syntax, is not case sensitive, is non-zero-based, etc. Yet, it excels in one thing: the barrier between the code and the results is close to zero. The language is kept minimal and very accessible, something that most other languages have traded off for more flexibility and complexity.
I installed QBasic on my son’s 11” HP Stream today through DOSBox and after a split second, we were already in the IDE, greeted with the introduction screen:
I then told my son that there was a very sacred ritual, mandatory for anyone who enters the secret inner circle of programmers, to start off with a program that greets every other programmer out there. As I dictated the formula, he slowly searched for each key, carefully typing with his right finger the magic words:
1
PRINT "HELLO WORLD"
He pressed F5 and looked amazed as he saw his code generating text on his black screen. He smiled, gave me a high-five, and then scribbled down the code in his little notebook so that he could remember later.
We went on to a couple more commands: CLS, COLOR, PLAY, INPUT, IF… Each of those only took a few seconds to understand for a 7 year old, and worked as expected. There was no complexity, no abstract concepts, no need to understand objects, classes or methods, no framework to install, no overwhelming content in the IDE. It was code in its purest simplicity and form.
After less than an hour, he wrote his first program on his own – an interactive and incredibly subtle application which lets you know the computer’s feelings towards you as an individual and sensible human being:
which he ran with utmost pride for his cousin and best friend Christian:
He then proceeded to explain to him how his code worked!
Within less than an hour, my 7 year old was able to not only write his first text game, but also to experience the fun and thrill that comes from creating, compiling and executing his own little program. Bonus points, it all fit on a single notebook page:
I was so glad that he got a glimpse of why I fell in love with programming. My only regret was to realize that in more than 30 years, we have not been able to come up with something even simpler for our kids:
Qbasic has a limited set of simple keywords
Qbasic’s help fits entirely in one F1 screen and is packed with examples
Qbasic does not distract the coder with any visual artifacts
Qbasic has a very confined and cosy dev environment, showing errors as early as possible
Qbasic compiles and executes the code in a heartbeat with a single key.
We have built more robust and more complex languages/frameworks/IDEs that are necessary for any real-life applications, but it feels we have failed to make a simpler and more direct access to simple code.
Enough said, today is all about the celebration of yet another person who discovered the love of coding!
Nicolas, this is a very nice post. Thanks. Nostalgia is good, even the coding one : ) … for so many reasons. Cheers. Francisco.
Nick P says (May 5, 2016 at 3:10 pm):
Great write-up. Check out FreeBASIC. I recently wanted to quickly solve a problem with a BASIC with no learning. Also started with QBasic. FreeBASIC looked… from what vague memory recalls… just like it with me picking it up in usable way in 10-20 minutes. Wrote app in pseudo-code, mapped that one to one in BASIC in text editor, executed it with simple command in shell, and it ran correctly the first time. And fast! So, try it out. If I get similar feedback, I might start recommending it to educators just to get people started and hooked on the initial high.
Nicolas Bize says (May 5, 2016 at 5:23 pm):
I’ll be sure to try it out, thanks for suggesting!
Chris Rosenau says (May 5, 2016 at 3:13 pm):
I agree with you that Qbasic is great. My feeling is that big business and arrogant programmers with big egos have ruined the beauty of programming. I started with basic on a commodore 64 and loved it. I now program PHP for the web and love it because it allows you to code how you want to code. Yet OOP was forced upon PHP and now it just isn’t as fun. I wish some would bring a new language that is fun and easy that goes beyond Basic and PHP. Great programs get built out of love and the fun of coding than out of code built by code Nazis. Anyway thank you for sharing the world of fun your son is having.
“Yet OOP was forced upon PHP and now it just isn’t as fun” Thank you, Chris! I though it was just me.
Roope Kangas says (May 6, 2016 at 5:13 am):
I dont think its OOP thats wrong its the Java way thats particularly horrible and is whats PHP seems to have adopted too.
Braunbär says (May 6, 2016 at 9:25 am):
take a look at go(lang) (- :
Rabo says (May 10, 2016 at 3:34 pm):
Sorry, bub. You don’t get to borrow QBasic nostalgia for your shitty language.
Shashi says (October 29, 2016 at 12:16 am):
10/10 article – like many others I first learnt qb style coding, mixed with assembly for speed, and all manner of insane optimization (look up tables to avoid floating point math ahaha) oh how I miss thee. For me the only thing close in terms of time to implement is probably JavaScript which imo is also very easy to learn ..
Max says (May 5, 2016 at 3:14 pm):
Wouldn’t using a subset of a scripting language like Python or Ruby provide a similar experience? Even though they have OO/functional designs, these aspects can be entirely ignored. Ruby in particular is designed to work well as an unstructured/procedural scripting language. And its keywords almost exactly match those of BASIC. if .. else, for .. in, while, until, begin .. end while, def, puts, gets. The only thing it’s missing is goto, but… ew.
Nicolas Bize says (May 5, 2016 at 5:23 pm):
I thought of that… But just printing and getting input from the user into a variable is really a lot more complex than what Basic offers, don’t you think?
Chris says (May 5, 2016 at 5:56 pm):
It’s not so different in python, especially with the input function in python 3:
1 2 3 4 5 6 7 8 9
name = input('what is your name? ') if name == 'noah': print('noah is the best') else: print('you are the worst')
python3 name.py what is your name? noah noah is the best
Chris says (May 5, 2016 at 5:57 pm)
Looks like the code tag didn’t preserve my spacing. 🙁
Nick Schubach says (May 5, 2016 at 6:31 pm):
Much like your grudge against the comment engine pointed out, it would be harder to teach a young kid that spacing is significant… let alone that the type of spacing is also important.
ProgrammerDude says (May 5, 2016 at 7:32 pm):
“it would be harder to teach a young kid that spacing is significant… let alone that the type of spacing is also important.” ^ Not any harder than teaching a young kid that every line must have a line number at the beginning. I think you give young kids too little credit.
ObviousPseudonym says (May 10, 2016 at 11:37 am):
@ProgrammerDude did you see a line number in the code? Didn’t think so. Also, QBasic supports (though doesn’t require) subroutines and functions, complex type declaration, etc… So, you can actually grow a pretty long way with it.
Nicolas Bize says (May 5, 2016 at 6:00 pm):
you’re right! somehow I was stuck with raw_input in my mind but it’s really cool to see the new input function in python 3.
UNIX administrator says (May 5, 2016 at 9:33 pm):
Yeah install umpteen bazillion files and libraries, just in order to be able to get a Python prompt… that’s the ticket! Brilliant idea. No wonder our industry has turned into living hell.
He had to install a whole virtual machine to get this to work, Python’s a single command install on any given OS… and is typically built in to any not-stripped-down UNIX-like environment?
David says (May 27, 2018 at 6:31 am):
If you’re the unfortunate sort who chooses to use Windows as their primary development platform, then perhaps that’s true. Normal operating systems (as in, almost every other OS used in any significant capacity), all come with Python pre-installed, simply because it’s one of the most heavily used languages in existence… Windows is an island. More than that, it’s an island on which resides islanders who don’t play well with others. Python was not invented at Microsoft, so Microsoft doesn’t include it. To Microsoft’s credit though, they have progressively become less like island-like in recent times. Perhaps they’ll even have Python by default some day.
Paul says (May 11, 2016 at 6:25 am):
Well, Python’s pretty basic after all!
Eric says (May 5, 2016 at 7:05 pm)
I wouldn’t say it’s more complicated at all, in fact it seems simpler to me… no dollar signs. name = input(“What is your name? “)
Ruby and Python are a lot more complicated than QBasic, but Lua isn’t. You’ve got strings, numbers, functions, and tables; that’s it. And if you start with the Love2D game engine, you’ve got all the graphics capabilities of QBasic in a much better-designed language without sacrificing any of the immediacy and simplicity. I’ve had great luck helping my kids (6 and 8) write simple games in Lua, though granted I’m doing a fair bit of back-seat driving, and they’ve already been doing Snap for years. https://gitlab.com/technomancy/maze-bomb/blob/master/main.lua
And I’d just like to add that I fully agree with the sentiment of not worrying about code being the cleanest or doing things “the right way”–at this point enthusiasm is much more important. And kids will only really understand why the “right way” is better once they spend time trying to maintain something that’s messy; that way the lesson really means something to them.
Renee Cousins says (May 10, 2016 at 4:12 pm):
You’re confusing simplicity and elegance of the inner workings of the language and virtual machine with the simplicity of programming in it. Something MOST programmers these days seem to have forgotten.
David says (May 6, 2016 at 3:33 am):
I grew up in the early 80s’s writing BASIC and lament that most computers do not come with a built-in, easily accessible development environment like BASIC. I teach middle school kids to code in an after-school robotics and computer science club. This year I switched to teaching the kids Python and it worked exceptionally well! Python is a modern, yet simple language. With add-ons such as pygame kids can easily write simple games with only a small amount of code. The whitespace issue with Python (which admittedly I don’t like either) turned out to not be that bad and with a some practice kids got used to it.
Peter A. says (May 8, 2016 at 12:28 am):
This times one hundred. Man, I wish I had something like BASIC in my early XP days, when I was just starting out with computers seriously (at the age of 8 or so (-: ). Anything. There was probably a few programs which were scriptable, but it probably wouldn’t occur to me I could be actually the one creating these programs. The funny thing is, I never actually stopped to think about how all these programs I installed came to be, that somebody must have created them, right? I actually had a GUI drag-and-drop game designer tool The Games Factory (wow that name takes me back!), but in hindsight I see I probably didn’t have much understanding of what I was doing then, other of than simple animation and moving objects with keyboard and mouse. In a sense, the (European/US) Commodore/Atari/ZX era kids had it much easier to get into programming – it was a very prominent part of computing at the time from what I can tell, with their computers’ built-in BASIC interpreters. I know this mainly based on the Internet computing history pages and people’s recollections on comment threads, as I wasn’t there at the right time to witness it (that, and the fact that my country’s computer availability would’ve presumably been scarce as it was communist until a couple of years before my birth). But then, with today’s Internet’s ability to exploit such vast repositories of human knowledge as StackOverflow, Google and YouTube, it’s also kind-of easy to get started with programming. I wish the new generation all the best with their journey of learning programming (greetings if any one of you is reading this post).
Nicolas Bize says (May 8, 2016 at 3:08 am):
Thanks for your comment. It’s true that there are a lot more resources today for those who want to start coding. However, I think that there was something about the confinement of the early days. With no internet and limited access to games (aka trading floppy-disks with friends), the only thing left to do was to create your own games with whatever tool was available. And it required persistence as there was nothing to switch your attention to. I think we were very fortunate to have tangible limits to what we had access to, as it forced us to rely on creativity to build new things to play with.
Richard Girou says (May 17, 2016 at 2:59 pm):
I started out with Q Basic on a Color 2 From Radio Shack. Back in the late 70’s or early 80′ writing programs for myself and tried games and loved it. Then I challenged my girlfriends son (13 yr. old) , who had a friend with a Mac 64 to write code to run on a Coco2 and Mac64 and I would do the same. We succeeded with our quest and went to more challenging tasks. Today both “kids” are still doing the same stuff with other languages and loving it. So I have to agree Q basic is a great way to introduce kids to programming. Great write up, Nicolas.
Peter says (May 7, 2016 at 2:33 pm):
“gets” to get input, “puts” to print input. Not complicated.
Nicolas Bize says (May 8, 2016 at 3:14 am):
TBH it gets a lot more complicated as soon as we want to get a bit more. Play some music? Draw a shape? those are one-liners in native QBasic. I love pygame and I think it’ll make a fine choice a couple of years down the road if his interest grows into a hobby.
p says (May 27, 2018 at 3:57 pm):
NAME gets – get a string from standard input (DEPRECATED) … DESCRIPTION Never use this function. … BUGS Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.
Dub Dublin says (May 5, 2016 at 9:01 pm):
QBASIC is actually great for this. The only other languages I know of that are comparable in terms of directness and simplicity are Tcl and Lua. Tcl is one of the great unappreciated languages, and is still the backbone in much software testing and automation and is great for quick and dirty code to stick a bunch of stuff together. Python has gotten better at that over the years, but I think Tcl is still better in many cases. Sadly, the Tk graphics haven’t kept up with the times. For game development, have a look at Corona and Lua. Lua is another beautifully lightweight and direct language, but it’s seriously fast (faster than Python and approaching C in some benchmarks!), is the backbone infrastructure of many commercial games, and the Corona environment makes it really easy to build games with just a few lines of code, and then target them to any of the major modern platforms. (For instance, creating a few shapes, and then attaching them to a physics model to let them move and bounce correctly really is only a few lines of code – check out the demos…) Not only that, you can also do really serious web infrastructure and server stuff using the Lua-based Tarantool (multi-master replication, anyone?), so it’s something you can learn and grow with from a first playing-around experience to truly web-scale application systems. (It is also 1-indexed, which I consider to be a feature, not a bug. No one but programmers starts counting by assigning zero to the first thing being counted…) Starting out, you can do more for less work with Lua than anything else I know of. It’s not mainstream yet, but it’s way too good (and getting better too quickly) for that not to change soon. P.S.: I wouldn’t worry about picking up bad habits, since the entire idea of procedural code is pretty much lost on today’s programmers who can’t do a thing without a bunch of heavyweight objects anyway. (Seriously, I no longer code, but I find I am able to fairly often make suggestions about another way to do things that would apparently never have occurred to someone who’s never written a FORTRAN or BASIC program, or hacked together bunches of shell scripts with the UNIX text processing tools. I don’t recommend awk as a language to learn on – it is certainly, um, different, but it sure does make a lot of otherwise hard things way easier than anything else I’ve ever encountered…)
Bradley says (May 5, 2016 at 3:32 pm):
That screenshot of the QBasic opening screen really brings me back. Thanks.
Gaurub Pandey says (May 5, 2016 at 3:40 pm):
I wrote roughly that exact same program (the “you are the worst” one) about 23 years ago as a child learning how to program. Awesome post; brought back so many memories
I’d like to respectfully put my side project forward as an improvement that learns from the lessons of QBasic: http://akkartik.name/post/mu. You get line-by-line programming without having to worry about intricate syntax, but you also get real procedure calls. You get gotos, but you can mostly use a simple form of structured programming that is just as easy to learn.
Nicolas Bize says (May 5, 2016 at 5:21 pm):
This looks pretty cool, and it has a nice doc on your github repo. I’ll check it out, thanks!
Mu seems really cool. What I find fascinating about it is not the final result but the process you got there. You seem to be using your wart literate guy. Reading your blog you seem inspired by Christopher Alexander. Me too! I’m a former student of Cope and was introduced to Alexander’s work through him. I love that you decided to take it to heart and you can literally see the piecemeal growth of Mu via your literate system. One important part of Alexander’s method, especially after reading Theory of Centers, is backtracking. You add a little, see if the whole feels better and go on. Or you undo and try something else. The undo and try something else, how are you planning on showing that? Seems as simple as deleting the latest file.
Thanks for the kind words, Maxim. I’m actually not familiar with Theory of Centers, so you have the advantage on me there. My favorite work of Christopher Alexander’s is actually “Notes on the Synthesis of Form”. I wasn’t smart enough to understand “A Pattern Language”, and I’m skeptical that there’s much mileage to be had in trying to apply that idea to software. But Notes is awesome. Extremely concrete and directly applicable. Everyone should read it. (And yes, I know it’s less fashionable than his other books, particularly since Richard Gabriel called it ‘juvenalia’.) But I’d love to discuss this further offline. Perhaps I can benefit from the Theory of Centers.
Derek Sharp says (May 5, 2016 at 3:50 pm):
There is a website, codingames.com, that offers puzzles and AI challenges related to game type puzzles and problems. I stumbled on it the other day and have lots of fun clearing out all the easy puzzles and many of the medium ones. I programmed QBasic and GWBasic as a kid, but am not a programmer, and I found these exercises fun and they really made me think. I am sure for real programmers, these might be childs play, but I would definitely recommend showing this to any kids or young adults interested in coding. Some people even get hired by companies like Nintendo for solving their challenges. Where was this when I was a kid?
Nice post. I just looked up to notice a still shrinkwrapped copy of GW Basic at the end of the bookshelf in the office! But plenty of opened and well used copies of Basic over the years.
Jeremy says (May 5, 2016 at 4:21 pm):
I love that you shared this story. I identify closely with it because this is exactly how I started programming – by learning and playing with QBasic, and writing things down in a notebook. My curiosity led me to read the code for the Gorilla and Snake games that are written in QBasic to see what could be done. I’m sure Noah will be an excellent video game designer!
Michelle F. says (May 5, 2016 at 4:35 pm):
Oh wow. I’m 31 and QBasic was my first language — I spent entirely too much time making terrible text-based roleplaying games with it as a kid.
hi nicolas, thank you. did you have a copy of qbasic or did you download from the net ? DosBox — did you have to do any particular configuration or was it plain loading qbasic ?
Nicolas Bize says (May 5, 2016 at 5:03 pm):
Hi Anjan! I used QuickBasic 4.5 and downloaded it online. I then placed a shortcut on the desktop which ran a standard DosBOX with the argument to launch QB.exe directly.
I learned to program when I was a kid with QBasic. I agree, nothing is as simple today. I have a 6 year old and he is loving minecraft too. I fully expect him to get interested in programming. When he was 3 years old, I felt a sense of distress knowing nothing is as simple qbasic today for him to learn. His birth and various social events inspired me to create something interesting. I wrote Fire★ which allows you to write p2p applications in Lua, including little games. When I wrote my qbasic programs I would share them with my friend on floppy disks. With Fire★ you can be connected with your friend on their computer and just share the game seamlessly, including the code. Even pair program. It isn’t as simple as qbasic, and it isn’t designed just for children. However, it might be the simplest way to learn how to write networked software. I hope to have my child test it one day.
Nicolas Bize says (May 5, 2016 at 5:17 pm):
This looks really cool! I love Lua and I agree it is a great language to start with. I’ll give it a spin!
QBasic Fan says (May 5, 2016 at 5:25 pm):
For anyone who’s interested, QBasic can still be downloaded from Microsoft at ftp://ftp.microsoft.com/softlib/mslfiles/olddos.exe The Microsoft ftp server does not support passive mode, so this may not work in all web browsers. You may need to use a command line ftp client.
Mehdi Hasan says (May 5, 2016 at 5:37 pm):
Best wishes for Noah! I found this link on Hacker News, maybe it’ll be useful 🙂 “QB64 is a modern version of the Basic programming language that allows programs created using Quick Basic 4.5 or Qbasic to run on Windows XP, Vista, 7, 8, 8.1, Linux and Mac OSX. It will work on 32 or 64 bit machines and has many new features such as stereo sound, improved graphics and TCP/IP internet capabilities. ” http://www.qb64.net/
Chuck Mire says (May 13, 2016 at 3:00 am):
QBasic, Quick Basic 4.5, and QBX (Quick Basic eXtemded) 7.1 can be downloaded here: http://www.qbasic.net/en/qbasic-downloads/compiler/qbasic-compiler.htm If you install DOSBox and then run any of these programs, you will find that they have syntax correction as an aid – and the source code is almost identical to QB64. so one can then write install QB64 and compile Windows executables. Look here to see several examples: http://www.qb64.net/forum/index.php?board=5.0
Fantastic read – and so happy that your kid has the opportunity to learn code as such a young age. Will definitely serve him well in life. I myself also learned programming via Qbasic – and this was “only” ~13 years ago. Qbasic is simple enough to be just fun to mess around with and see “I made this”, no need to care about best practices if you’re young and/or don’t even know if programming is something you want to persuade. Keep up the good work!
Might I suggest http://www.hackety.com/ which was inspired by the original creators experience with qbasic.
David says (June 2, 2018 at 8:37 pm):
When I open the page I get “Application Error” and nothing else on the page. Is it me?
winder says (May 5, 2016 at 6:11 pm):
thanks for sharing this – my dad bought a copy of turbo basic compiler for me 25 years ago. I asked for turbo pascal… at least he got the turbo right!
DavidBechtel says (May 5, 2016 at 7:00 pm):
I agree that QBasic is very easy to pick up. I would also like to direct your attention to the Kano implementation of the Raspberry Pi. This is very directed at that age group and allows kids to understand what makes up a computer and then what it does and even has a programming environment for that age with Minecraft and Python (the snake) games to play and modify.
I wrote a 3d cube engine in QBASIC when I was a teen, so many memories.
S. Parker says (May 5, 2016 at 7:23 pm):
As another commenter noted, check out QB64! It maintains 99% compatibility with any QBasic program (really, the not supported stuff is super-obscure), and runs on modern operating systems without the hassle of DosBox or emulation. It also implements dozens of new commands allowing much more flexibility (such as full-color screen modes). It even keeps the old-school white-on-blue IDE
Try QB64 … it’s a free version, with the same blue UI (and should be compatible), but all sorts extras have been added + it works on modern OS’s too.
Jay Vaughan says (May 5, 2016 at 8:01 pm):
Nice article! Though I take issue with the fact you didn’t try out antirez’ excellent LOAD81 before you resorted to that abomination that is QBasic: http://github.com/antirez/load81 All the color of QBasic, none of the GOTO’s. 🙂 Plus: Lua.
check out tynker – an ipad app (and more besides) – its so bright and cheery and kids just ‘get it’…
Keith says (May 5, 2016 at 9:19 pm):
Just curious, why didn’t you like smallbasic? My son did ok with this, and it seems just as simple as qbasic (if not simpler), except a lot more helpful. Also easy to get started on graphics!
Nicolas Bize says (May 5, 2016 at 9:25 pm):
Maybe we’ll look into this down the road… Just seemed that TextWindow.WriteLine (“Hello world”) was already too complex to simply print out some text.
Keith says (May 5, 2016 at 9:38 pm):
I guess TextWindow seems a bit more complicated I started out with doing doing a one line program :- Turtle.Move(100) then
Very quickly he got used to the ObjectSomething way of getting to the toys. Also the documentation on the side is pretty good to get started with most of the toys. Only thing I’d of liked ( and they consciously made the choice not to do it) is the concept of a function. Because once their programs get big enough ( and boy, my basic programs from when I was a kid were big convoluted messes) teaching the idea of a function is kind of a gateway to the bigger world of programming.
RRR says (May 10, 2016 at 8:15 am):
Sure, you need one extra word, but in the same hour you could have gave him, with very little extra effort, a brief introduction to object oriented programming. Kids can totally deal with an extra word and a comma. Also, the autocomplete feature in smallbasic is great for a slow typist, such as a kid, and is also the help system of the IDE. I totally recommend putting aside your selfish melancholy or whatever and show smallbasic to your kid! PS: My QBasic “bomber” and “fighter” games that I wrote as a kid were the best plane games in the history of games with planes, obviously. B-)
The lesson here is that it’s less about the specific fitness of a particular language, and more about just getting your hands on something and rolling with it. Yeah, a language with line numbers will never be optimal, but that’s beside the point. The real value of QBASIC here is that Dad knows it and can immediately smooth over any roadblocks that get in the way of that initial fun and discovery.
Leon says (May 5, 2016 at 9:41 pm):
Lua is a pretty neat language, and if you want to have some “fun” with it, check out https://love2d.org/
Derek says (May 5, 2016 at 9:51 pm):
Have you tried LOGO? When I was a kid, I learned it without knowing it was programming. I just played it as a game. Years later when I was actually learning coding seriously, I realized why is it so similar to that turtle drawing game?! http://www.calormen.com/jslogo/
Adam says (June 6, 2018 at 6:51 pm):
This. MSWLogo launched my programming career back when I was a kid and just thought it was cool I could make it draw lines
Never thought I would see that blue QBasic screen again. Good times. I remember finding QBasic on my own as a kid and messing around with it making games. We had some computers in our library at high school and they had QBasic on them. They also had a ‘no games’ policy, so I got told off for playing a game by one of the librarians… except I didn’t care because I explained to her how I wasn’t playing a game I was testing a game that I was writing. Haha. I wish I had some guidance back in the day though. I distinctly remember arrays being too abstract for me to understand what they were, how to use them etc. Someone to guide me on the more technical aspects would have been wonderful. I think you made an excellent choice choosing QBasic for its simplicity. Glad to see your son taking such a keen interest in programming. We definitely do have the best job! Hope to teach my son someday too. And I’m inspired to introduce him to QBasic when it’s time!
Some of the nostalgia is captured at codebymath.com. Easy graphics, sound, and printing things to the screen.
Tim says (May 5, 2016 at 11:01 pm):
“Qbasic has a limited set of simple keywords (the entire help fits on a single F1 screen and is packed with simple examples!), does not distract the coder with any visual artifacts, has a very confined and cosy dev environment, shows errors as early as possible, compiles and executes the code in a heartbeat with a single key, and is extremely straightforward.” I’ve been a programmer for decades, and while I’ve never used QBasic myself, I still find these to be valuable qualities for anyone, not just for kids. Sadly, while there are some professional-grade programming environments that have most of these qualities today, they don’t seem to be very popular, and companies don’t tend to use them for serious projects. Professionals tend towards languages with big complex grammars, for some reason, even if they’re not any more powerful. But those of us who know where to find simple elegant programming languages do really love them!
ignorantguy says (May 5, 2016 at 11:07 pm):
Nice article. I wrote my first program in QBasic too!! I added two numbers and I thought that was the greatest thing ever.
I learned to program on old paper terminal. When I started on PDP-11’s, we had green bar or magnet paper that scrolled as you typed. To make a program:
1 2 3 4 5 6 7 8 9
$ NEW $ 10 input “What is your name?”; A $ 20 IF A “dave” THEN 50 $ 30 PRINT “You’re awesome!!!” $ 40 GOTO 60 $ 50 PRINT “You’re okay.” $ 60 END $ SAVE myprog Saved.
We didn’t have code blocks at all. You had to use GOTO and GOSUB to separate code.
QBasic is not the best. “Noah is the best!” 😉 I read your article in the bus and I was wondering if you had thought about Python. I just tried re-creating the little program Noah wrote and it’s quite simple using IDLE (which takes care of the indentation for you and can run the script with the F5 shortcut as well). In addition, Python has nice little libraries for teaching children, such as the turtle module that allows to get nice graphical output, which is quite stimulating for children I think 🙂 Thanks for your article and all the best to Noah in his video game creation journey!
You should have a look at the old 1980s Usborne books, which they have archived in PDF form online. They were written for old microcomputers like the Commodores, BBC Micro, Apple II and ZX Spectrum, but should be applicable to QBASIC. I particularly recommend Write Your Own Adventure Programs For Your Microcomputer. It has a good step-by-step walkthrough from concept to planning the structure of a text based adventure. http://www.usborne.com/catalogue/feature-page/computer-and-coding-books.aspx
Peter says (May 6, 2016 at 6:30 am):
\o/
Raine says (May 6, 2016 at 8:00 am):
I started with QBasic as well back in ’92. Oh the memories :’)
Aah, I still remember back in third grade – “what? you can put whatever you want after print?”. And then I found a BASIC book in the attic and discovered the “Sound” instruction. Needless to say , after a week or so I was forbidden to use it.
Sawan says (May 6, 2016 at 9:44 am):
Man. I miss GWBasic a alot…
Patrice says (May 6, 2016 at 11:53 am): Ah ah, I love your child first program! I think the first I wrote myself was doing basically the same thing!:)
amwales says (May 6, 2016 at 12:34 pm):
Thankyou, this brought at tear to my eye. This is just how I started out, just enough to want more. Good luck, awesome game Noah.
Cool! I am also for teaching kids BASIC. You could also try emulators for some of the 8bit computers which all have BASIC. I can recommend Amstrad CPC and MSX, very nice command set, its pretty easy to draw and make simple games! PD: FreeBasic is also very cool on modern PCs.
OBloodyHell says (May 6, 2016 at 4:03 pm):
As to the purists, as Monty Python would say, “Fornicate The Penguin!!!” This is a First Reader situation. You don’t complicate thecstorybwith advanced concerns like Predicate Adjective bs Predicate Nominative… This is See Jack run. See Spot run. See Jane run. Run, Spot, run!! QB is perfect for such…
Jzna says (May 8, 2016 at 8:02 am):
Try Processing, http://processing.org “Processing is a flexible software sketchbook and a language for learning how to code within the context of the visual arts.” It’s really Java, but in an environment that makes writing small visual programs very simple. Or, the logical move from QB would be Borland’s Turbo Pascal. 🙂
My son is just shy of 6 months, I wouldn’t have read this the same way half a year ago. Thank you for this very inspiring read 🙂 (your game looks cool too, just about to play it)
Yan Coutinho says (May 9, 2016 at 10:10 pm):
I’ve seen people using QBasic in coding live streams on Twitch and Livecoding.tv. It is, surely, a good way to learn coding.
Miguel says (May 10, 2016 at 6:00 am):
“is not case sensitive, is non-zero-based” are between the limitations of C presented as good programming. case sensitive is simpler for the compiler, but declaring 2 variables with the same name with different case is bad programming, especially if you want to allow converting code to another language.
Pablo says (May 10, 2016 at 7:31 am):
Nostalgia 🙂 I also started with QBasic when I was 8 and also started with a text game! Noah has now a tool to create his ideas! Awesome, and welcome to the club!
1 2
10 PRINT “HELLO NOAH!” f5
Rui Marques says (May 10, 2016 at 7:44 am):
Loved the post. I remember my first experiences with BASIC on sinclair 2048 and assembly after that. However I must disagree with you. We did create some languages good for young ones to start (I also had this as a must for any geek out there). Lego Mindstorms has a great system to introduce programming technics and really watching it doing something 🙂 It shows the concepts without going too deep on commands, wich I think is great.
A group in England has children -elementary and secondary – learning Python using the Raspberry Pi.
Peter Monks says (May 10, 2016 at 11:35 am):
This post got to me on two levels… First, I remember when I learned QBasic back in the day of doing my A Level computing course in the late 90’s. Why I was being taught such an old language I don’t know, but I distinctly remember the obligatory “Hello World” program, quickly following my inputting your name and printing to screen, and then feeling amazed that I “got it”. It eventually lead to me building Tic Tac Toe in QBasic, then other languages, and today some 15 years later I am now building web systems connected via queues, services and databases, a far cry from the days of putting coloured text to screen! Secondly, as a father myself I’m hoping my kids will also one day ask about what I do and how everything works. Reading about Noah’s reactions and learning process was great and I hope he keeps it up.
Jimmy Olano says (May 10, 2016 at 11:44 am):
Thanks for this article, BASIC and after QBasic was my first language programming, I’m glad when I remember these days!
QB64 uses most of the Qbasic keywords and runs your programs on newer OS’s without DOS or DOSBox. Also has new keywords for modern systems to use Open GL and 3-D images with millions of colors! Plus it is FREE! GOTO http://www.QB64.net
Tim says (May 10, 2016 at 12:09 pm):
Have you tried Logo as a kids first language?
C R Oberholster says (May 10, 2016 at 12:59 pm):
I started at age 6 with a single gasp 360kb floppy disk! containing the entire operating system AND BasicA. (1981 was such a fun time!)
Alan says (May 10, 2016 at 1:02 pm):
Nice article. Back in the day I used to use QBasic programming as a ‘proof of concept’ before coding he final solutoin in assembly. I was going to give my young son a ZX-Spectrum for the same reasons you describe here. Simple instruction set, and simple to get up and running with some rewarding results that may just get him interested. After all, it’s the ultimate toy. It does whatever your imagination tells it to do!!
I use PHP and all the other default languages for a web developer but for pure pleasure of coding I always go back to PureBasic. ( works on Linux, PC and MAC ) Thanks for the Basic idea. I will teach my 9 year old daughter using PureBasic
Don’t stop with just QBasic for your son. Move to the next level PowerBasic. I started programming in the early 1980’s using GWBasic, Commodore Basic, etc. Then started coding real business programs in GWBasic, then QBasic, then Microsoft Quick Basic and then PDS 7.1 (Professional Basic). In the Windows world I found the transition difficult at first and and tried a number of Basic’s finally falling back to Visual Basic 1.0. In time I moved beyond Visual Basic, to PowerBasic (in the DOS days was TurboBasic), learned the WIN32 API and now have gone far beyond anything I did in DOS Basic’s. PowerBasic has a console compiler which would be like QBasic on steriods, but with full access to the WIN32 API, is a true 32 bit compiler and is fast, fast, fast. One can move on to the PowerBasic Windows compiler and either use its simple Dynamic Dialogs command set or code using the WIN32 directly if prefered. PowerBasic has the raw power of C, with the ease of QBasic.
JH says (May 10, 2016 at 2:46 pm):
First of all, I also started with QBasic, using my father old notebooks. But now that I’m more into this thing, I cannot understand why people don’t just teach JavaScript as first programming language. JavaScript is ubiquitous and can now be used to code apps, not only client side code of web pages, so It seems like a big win.
Rocky says (May 10, 2016 at 3:08 pm):
That screen brings back many happy memories 🙂 I would love to GOTO 10 again. Well done Noah.
Cyrus says (May 10, 2016 at 3:32 pm):
Qbasic is a structured language and no line numbers are necessary – that’s just for backward compatibility with gwbasic and older variants which had line editors
Jorge says (May 10, 2016 at 6:33 pm):
Good memories… I think my programming skills got stuck since QBasic. Thanks for the writeup!
In the early 90s Prodigy had the best QBasic community, where we even invented compression techniques to share code to each other and fulfill single-post length requirements on the message boards. It was glorious. Thanks for taking me back. view-source:http://files.mhulme.com/files/qbasic/prodraw2.bas I don’t know if that program there will run, but when I was 12(?) it did, and it was better than Paint. 🙂 I hope Noah can eventually use something in it, which would be the ultimate reward.
Never thought I would see that blue QBasic screen again. Good times. I remember finding QBasic on my own as a kid and messing around with it making games. We had some computers in our library at high school and they had QBasic on them. They also had a ‘no games’ policy, so I got told off for playing a game by one of the librarians… except I didn’t care because I explained to her how I wasn’t playing a game I was testing a game that I was writing. Haha. I wish I had some guidance back in the day though. I distinctly remember arrays being too abstract for me to understand what they were, how to use them etc. Someone to guide me on the more technical aspects would have been wonderful. I think you made an excellent choice choosing QBasic for its simplicity. Glad to see your son taking such a keen interest in programming. We definitely do have the best job! Hope to teach my son someday too. And I’m inspired to introduce him to QBasic when it’s time!
Nikhil Rodrigues says (May 12, 2016 at 8:56 am):
Hi Nicolas, I thank you very much for refreshing my early sweet memories during my school days when the very first programming language I ever learnt was QBASIC. I also very clearly remember what the acronym sttod for – Quick Beginners’ All Purpose Symbolic Instruction Code (my then computer teacher had made the full class memorize it, hehe). Those days were really awesome and I used to marvel how the computer could solve the arithmetic and print stuff so fast and play some tunes and the most important part was drawing lines and circles. Wow, man! I really missed those days. I was, I think, in class 7 in school back then. Later for I learnt C, C++ and finally Java but did not find the same amount of fun I had that time. I am a software engineer now working in an MNC. I use Java, PL/SQL (for programming and maintenance)and Selenium automation (in testing) alongwith UNIX for shell scripting. But really man, I really cherish those days and you have literally brought tears into my eyes. It is a very great decision to have your son recognize QBASIC first. I shall do it the same to my son or daughter if they consent. Are you on Facebook dear friend?
Riccardo Tacconi says (May 14, 2016 at 8:02 am):
“It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.” Dijktra
Joseph says (May 17, 2016 at 6:54 pm):
Nice post Nico. Some many memories from QBasic… However, regarding Noah, children from his age or anybody starting to code, I think that what they need to acquire first is the concept of computational thinking. Once one gets that, he can pick up any coding language because he understands that differences between languages are mainly syntactic. I’ve seen so many adults starting to code at uni. They did their best to pick up the language in itself but because they didn’t have a ‘computational thinking mind’ they were completely lost when they were asked to code something. That’s why I find apps such as Scratch very good for children because it’s a nice interface between cartoons/playing and hard coding. It introduces nicely conditionals and loops. And then, we all have our favorite coding language, mine being FORTRAN 77 :D, so he’ll find out his when the time comes 🙂 ++
Nicolas Bize says (May 17, 2016 at 7:01 pm):
Haha hey Joseph good to hear from you man! 🙂 We tried Scratch but he didn’t like it so much… I’m wondering if maybe it’s because the IDE is so visual that the actual visual compiled result does not pop out and has that fast wow feedback? Not sure… He’s still super young and I don’t want to push him any direction so we’re rolling with the wind as we speak, trying out different things… QBasic seems to be the language that has sparked the most interest for now so he’s using that… Haven’t showed him Fortran yet, waiting for him to do something wrong, I’ll have a punition ready 🙂
Joseph says (May 18, 2016 at 8:10 am):
Haha 🙂 Good one!
Pansophical says (May 18, 2016 at 4:04 pm):
If you can get your hands on the older Dark Basic program, then your son might enjoy that. It has similar experience as the Qbasic, but it adds some pretty easy to use built in stuff aimed toward making games. It’s been a long time since I used it, and they don’t see the offer the legacy Darkbasic for sale anymore (just the pro version and then some other stuff) It might be worth tracking down and checking out.
André Willik Valenti says (May 30, 2016 at 3:23 pm):
Loved this post! I learned how to program with QBasic, too, and agree that no tool has ever been as simple, direct and fast. Lots of fun in the 80’s and 90’s!
Greg Mayer says (May 30, 2016 at 5:23 pm):
I loved this post 🙂 My son just turned 7 and I can’t wait for him to start writing code. Currently he helps QA my in-development iOS game, and he builds amazing stuff in Disney Infinity.
Your post was very inspiring to me as I was at the exact same step in my quest for the perfect IDE/language for kids, and it convinced me that QBasic was an excellent choice. In case someone is interested, I wrote a short tutorial to the install of QBasic+DOSBox on a Raspberry Pi : https://sgalles.github.io/2016/06/02/Install-Q-Basic-on-a-Raspberry-Pi.html
BillyBob JoeBob says (July 29, 2016 at 12:50 am):
Tell, me when your game gets released on xbox 1. JK Seriously though, it was fun, good job. I tried GGJ once, we never finished our game, but the experience was amazing.
Big D says (August 9, 2016 at 12:03 pm):
Hi there Try BlitzBasic3d or BlitzBasic Max. It’s open source now.
Paul says (August 13, 2016 at 11:40 pm):
Great post, thanks very much. Brought back memories of a friend of mine showing me how to code in qbasic when we were kids. I am coming to programming relatively late again now and really enjoying it. Coming from a sysadmin background in a Windows shop, powershell got me into it and now I am learning C#. Definitely want to teach my kids programming too even just to get them into logical thinking.
Tony C says (September 2, 2016 at 4:40 am):
Wow, Awesome stuff, I loved QBasic back in the day. For anyone who loved coding in Basic there is a modern day platform that ties in nicely with the Maker and STEM movement around these days called the Micromite. The platform uses a rewrite of GWBasic (Precursor to QBasic) called MMBasic, and you also get to build the “PC” itself. Quite a bit of fun. (New version out too now). Allows reading of external sensors and control of external devices like the Arduino or PI but all done with fairly simple BASIC code.
This reminds me of how I started with QB back in the day. Back then there were so many sites devoted to teaching the language and unfortunately most have disappeared. It’s truly a perfect learning language for people interesting in getting into programming. My old Qbasic (and other languages) site is still online after all these years: http://eriks.servehttp.com
Actually, case sensitivity in a programming language is a fault. There is absolutely no need for it, and its existence frequently leads to problems. Thanks, Jeff Bowman Fairbanks, Alaska
Juanjo says (July 2, 2017 at 2:54 pm):
Hi! Nowadays i use Quick Basic. It´s a pleasure!! It has many libraries that you can use in your applications, written in other languages like C or Assembler. I made programs with buttons and mouse, like Windows!! You only need to have a good imagination and time! It´s fantantic to make module programming. I usually use a 386SX with only 4 megas of ram with DOS 6.22 to run my programs. Good to meet crazy people like me!!
You know, I’ve probably read this blog posting three or four times since it was first posted, and I have to say that the author is spot on. Yeah, I too know that the language isn’t perfect, and it does teach a few “bad habits”. I know this because my first language was BASIC, too – specifically a version of Microsoft BASIC installed in the ROM of the TRS-80 Color Computer. I started with that machine when I was 11 years old, back in 1984. I was in the 5th grade, and it opened up a new world for me. I still have memories of my dad and I typing in the first bit of code in the tutorial manual that came with the computer, and instead of hitting the “enter” key (aka return) to move to the next line, we “spaced” over to the end and down to the next line! We ran it – and got back “SN ERROR?” – the infamous “Syntax Error”. My first error (well, that’s not exactly true – my first “computer” was arguably the simple controller of the Milton Bradley Big Trak – and I know I had errors in those programs!). Ultimately, that all led to where I am today, employed as a software engineer for the last 25 years, and having gone thru a ton of different languages in that time. From Pick BASIC (a “business BASIC” still in use!), to assembler, to C/C++, Java, Python, Perl, PHP, dabbling in Lisp, Javascript…and QB. Today, I still have a soft spot in my heart for BASIC; my favorite form of it – and what I think is probably the best implementation – is QB64. I have two other compiler/interpreters on my phone. Yesterday I coded up a simple Truchet tile maze generator for the Color Computer, using an online javascript-based emulator for the development! BASIC will always be close and dear to me; part of my career involved the development and maintenance of a largish Visual Basic system for an employer – that they still use to this day (almost 15 years have passed since I left them, but they have yet to find a suitable replacement). I often wonder why – in this era of talk about “teaching everyone how to code” – why we don’t teach BASIC to people. It’s almost the perfect language for this. If we really wanted to round things out, we’d teach LOGO as well. There are a lot of people out there who could be excellent programmers, people who would love to program, and don’t know it. Simply because for a beginner, they don’t even know much of where or how to start. As the author of this blog post noted, even getting QBASIC running again is an exercise for the beginner – nevermind the “experts”! You have to basically know how to install and set up an emulator of an operating system, or you have to set up a virtual machine, or dig out an old computer and make that run something, or… No longer (well – there are a few examples) can one just buy a computer, turn it on, and be greeted with a prompt begging you to input some code to run. I do tend to wonder though if such a computer wouldn’t find some audience. I know of a few examples like this (one which is arguably as close as possible to that retro style using current components is the Nuts and Volts Amigo computer – http://www.nutsvolts.com/magazine/article/december2015_Weston). I’ve long thought there is something being missed in trying to educate people about computer programming, and we continue to try “new ideas” when the solution to the problem was solved a long time ago back in the 1960s. Instead, we try to teach systems to beginners that are much more abstract than what is needed to learn the – ahem – basics of software programming, and this can cause confusion and disinterest in continuing. If we were smart, we’d realize that maybe our forebears knew something we didn’t, and work with their ideas and knowledge, instead of against them.
Kris says (August 15, 2017 at 8:35 pm):
I know this thread is old, but man …. QB4.5! That brings me back. I taught myself on TI-Basic starting in 1981 when I was 5, typing long strings of hex code directly in order to use any kind of graphics. Quickly transitioned to QBasic and with the rapidly advancing home computer technology and the super user-friendly IDE I was creating all kinds of programs over the next 10 years, including Fantasy AI game engines, full featured eBBS platforms, graphics processors, side scrolling video games, etc. etc. I even used QBasic professionally in 1999 to automate machines in a factory, building a GUI on a 386 that plugged into a 6 axis USB stepper motor controller. Unfortunately, I have a contrarian streak and when a VC told me in 2000 that they would give any kid who knew how to code $1M if they had a business, I left programming behind to go to business school since I didn’t feel like learning C++. Now I’m slowly realizing that I should have never stopped coding, so I’m re-teaching myself, and see that modern languages are definitely more efficient, but sorely lacking in an intuitive IDE like QB4.5 and have a lot of syntax requirements which likely have negligible performance gain. I actually found this while looking for a Python IDE that is better than Canopy, but I’m glad I found it, as I have also been debating teaching my kids (7&9) QBasic or letting them learn Python with me. They play around in Scratch, but I find it hides the functioning of the program behind layers of the GUI and all that visual drag and drop makes it harder to get to the core of what programming is about. I have seen some others, like Glitch, that I was going to try out, but now I’m psyched to install QB4.5.
I don’t know how old this is, or if the author still reads the comments, but a modern version is called QB64 (there even is a Twitter @QBZ64team for it as well) which does not need an ugly DOSBox setup, but does run on all three major desktop OSes. Psst. The homepage is here: https://www.qb64.org/
Allen Jones says (December 15, 2017 at 6:08 pm):
Hi, Katie. The homepage is actually http://www.qb64.net… not .org. AND THANKS FOR THE HEADS UP !!!
Allen Jones says (December 15, 2017 at 5:36 pm):
I would not doubt ANY of you disbelieving what I’m about to say. It sounds totally improbable. I discovered Basic in 197… 7 or 8. We had a Wang 2200 computer at work that was used to compute monthly payments and to print bank contracts. The program was written in Wang’s version of Basic. The fellow who’s job it was at the bank to use it had a heart attack and passed away and my boss jammed me into that empty office and said I’d better learn quickly how to use the thing because my continued employment depended on it. The program was super easy to use and learn and within a couple days I became comfortable with it. THEN it happened… the thing went nuts. It began printing out all of it’s many thousands of lines of uncompiled plain Basic code on its 14″ wide big metal Wang daisy-wheel printer. I killed the power but it started over every time I turned it back on. We called the software company who sold us the hardware and software but they said it’d be several days before they could get there from another state. Curious… I decided to see what it was printing! I mounted a big box of 14″-wide pin-fed paper in the printer… turned it on again, and the thing printed for nearly 12 HOURS. Had to pause printing to change to a new RIBBON fire or six times !! I carried that huge stack of fan-folded paper around for months and studied it… IF, THEN, ELSE… uncompiled NOT COPYRIGHTED plain Basic… Eventually I realized – hey – not only can I understand this stuff… I could do 80 or 90% of the the same stuff with about one forth as much code!! How cool was that. So yeah, “I went to school” on what that bizarre ton of code taught me. Over the years some said I “stole” that code. Nope. Never used a single line of it. However it was a great teacher (professor!) because it TAUGHT me how to write code – just like a French book teaches French. You wouldn’t say you STOLE the French language – just because you learned French from reading the instructional French guide. I even phoned the software company and told them the program was printed and they offered to answer software questions! Gotta remember, folks, this happened in 1978… almost 40 years ago – before most of you were even BORN. Copyright law for software didn’t even EXIST 40 years ago because it’d just been INVENTED. Months passed while I figured out how to build my own program and shortly I actually wrote my own finance program from scratch which ran way faster because it was tiny compared to the company who supplied the original bank software. Wang computers only had 4k of ram so files had to be chained together… and the smaller the package – the faster the execution. Another bank heard about me and offered to PAY ME (woo hoo) to set up their Wang machine… and then another bank… and then another. Then car dealers and motorcycle and boat dealerships called. They were purchasing the Wang computer JUST BECAUSE it was the one I knew how to write code for… all of this happening just before IBM introduced the PC and the AT. It occurred to me that I seemed to be looking at the word, “POOR”, from the other side for once in my life (banks still to this day don’t pay much!). I incorporated my little company in December 1984 and today, in December 2017, it’s our 33rd year in business. And I still use that same 16-bit GW Basic (compiled, thank you) software in all our customer’s businesses. As the years rolled by I learned how to design Adobe PDF’s and how to populate them with customer data from my little program using “shell” and daughter operations to call FDF’s… such that NOW virtually all the many legal documents (sometimes as many as 15 or 16 individual documents) that have to be printed and signed by customers at the time a loan is closed are all true originals that print out back-to-back usually by a super fast high-end laser up to 80 pages a minute. I agree with all of you who say I should have changed to VB and DOT NET etc., etc., and I gotta tell ya… I did try. Heck – I’m STILL trying. But I hit the magic number on my last birthday – 70 – and I’m just not up for it. I’m maintaining a dwindling book of business thanks to natural attrition… down from over 80 monthly paying customers back in 2000 to just 10 or 11 now… but that’s okay. I’ll let you kids figure out to fly every new iteration and machination of Basic that continues to come down the pike. But who EVER – in their wildest DREAM – would have thought that good old GW Basic… compiled using QB3 (not 4, mind you)… would have a true shelf life of THIRTY THREE YEARS. Doubt me if you will. I get it. It’s human nature. But every word true. All I can tell you guys is dream on. Sometimes it works.
Nicolas Bize says (December 15, 2017 at 9:29 pm):
Wow that was such an awesome read Allen, thanks!! 🙂 I know that there’s still a lot of Cobol code currently being used in a lot of areas we don’t expect. I wonder how many other Basic gems like yours are still up and running after all those years.
Allen Jones says (December 18, 2017 at 8:06 pm):
I’m out on a limb here… but I’m guessing… one?
) aj
Pierre Bonjour says (December 20, 2017 at 1:03 pm):
Hello Nicolas, I have been adicted to coding since I am 10 because of QBasic, I had almost tears in my eyes when I read your article since I thought that for once someone was sharing my exact thoughts ! I couldn’t agree more with you !! Reading your article made me decide to do something about it and I am currently re-writing QBasic, it is a difficult task but I will try to make something as simple as I can, and you can trust me for keeping the spirit, I’ll keep you posted as soon as I completed the first version, y’ou’ll be the first to know, it should be in a week. Thank you so much for sharing this thought with us !!
Nicolas Bize says (December 20, 2017 at 7:45 pm):
That’s awesome, can’t wait to see what you come up with 🙂
George says (January 6, 2018 at 4:00 pm):
“QBasic By Example, Special Edition Special Edition“ Greg Perry I dont program much.. but in HD i studied from this book and cross trained into C++ using projects from here. This book hasnt changed but has a universal quality.. it sums up the basic of qbasic and can be learned in a semester if not two. For rudimentary concepts its so nice and easy. If there was any hint of any programming knowledge i owe it to qbasic and learned sorting programs. i did my calculus on qbasic as a challenge. Qbasic gets so much flak.. I was happy to stumble on your article with opinion I strongly agree with. I wish everyone would agree qbasic is the best to start kids off. Any knowledge learned will NOT stop anyone from further education (ie C++ or puthon). We all have to master one language anyways. I am getting back to programming as a hobbyist but getting into python. But i will be sure to parallel my education with qbasic and reinforce the concepts. Thanks for this article!!
Pierre Bonjour says (January 16, 2018 at 1:05 pm):
Hello Nicolas, Still not finished, I’ll need more time, making QBasic is much more complex that what I expected… But I won’t stop until I’m done and I’ll keep you posted. I also found this : http://www.qb64.net which I had been looking for years, but mine will be a little bit different, can’t wait to finish it !!
Bill Trail says (February 14, 2018 at 8:47 pm):
So… let me get this straight, Pierre. You’re, um… you’re designing / creating an entirely new version of Basic? Holy (insert favorite body function or most sacred animal here) !! Why? Maybe I got this wrong… but YOU guys are not writing software like I did for the banking industry. Oh no. You’re just writing a new version of an existing language. Oh I get it. You don’t need money. You aren’t poor like I was back in the day – grasping at straws to put the next meal on the table. You’ve got so much spare time and TALENT that you’re just gonna sit down and redesign the design. This is when I’m pretty sure I’ve lived too long – when you kids are so freekin smart that you can just whip out an entirely new computer language like it’s sausage on a 4th of July freekin BUN ? Well. Okay den. I raise my beer glass to you guys. More power to ya. May the need for a bigger paycheck never hit you in the HASS like it did me all those years ago. PLAY ON. p.s. Why not turn all that mental horsepower into building the first 5 mile pillarless bridge or a $20,000 500-mile-per-charge Tesla killer or something else, y’know, useful.
SamW says (May 27, 2018 at 1:19 am):
Still have fond memories of QBasic -really learned matrix algebra writing a regression program in QBasic; no regression function in early … Enable, Lotus. Long ago and faraway. Your son will feel you through the language. Talk about shared experience with Dad! Lucky you, lucky son. BASIC!
Chris S says (May 27, 2018 at 2:25 am):
Hi Nicolas, Just discovered this post and it has lit a fire beneath me. My oldest son, who’s name is also Noah, is 5 and graduating from Kindergarten next Tuesday. While he’s still a bit young compared to your son at the time this was written, the thought of sharing a love for software development is thrilling. I’ve been patiently waiting since the day he was born, and am so excited that he’s begun developing the Basic (haha) skills needed to start in earnest. Thanks for sharing your story; looking forward to sharing my own soon! -Chris
David Cornelson says (May 27, 2018 at 4:41 am):
I just revisited True Basic and it seems good enough. The demo version won’t open or save files, but it’s procedural BASIC as opposed to line-number oriented. I started with BASIC on PDP-11’s and in the late 80’s did consulting work using Microsoft PDS (Professional Development System), which was an actual BASIC compiler (not P-code or interpreted). I got it running in a VM if you’re interested, but nothing is transferable in/out of the VM, so it’s not that usable. But PDS was a fairly sophisticated procedural syntax and the ability to create include files and such. I’d also recommend later on you might try Inform 6, which is an OO-ish static-y text adventure programming language. TADS is probably a more traditional OO implementation of a text adventure language. Writing games is always a fun way to learn. Cheers!
Sake says (May 27, 2018 at 6:20 am):
I’ve seen my father wrote the first program in BASIC to introduce men computer when I’m 12. The program is called “You Stupid !”. The program random 2 numbers and ask the user to enter the total sum of those two numbers. When the answer is correct it will response with compliment. When the answer is wrong it will response with “You Stupid !”. And then the program start another math question with other random numbers. This simple program demonstrate quite a number of elementary concepts of programming — condition, variables, function call, loop, and blaming.
Hi Nicolas, Can you share a brief writeup about how to get hold of a decent QBasic and the version of DOSBOX/Windows that you used that will make life easier for those who want to try your stuff out. I didn’t have access to a computer till I was in my 20s. My son is now 7 and I’d like to introduce him to QBasic. BR, ~A
Chris says (May 27, 2018 at 6:56 am):
I was 8 when i learned Basic on my C64 without any drive or datasette but with a large Book that contained example code. I am now a successful Web Developer. Greetz to your son 😉
Hi Nicolas, being captivated by the article and diving deep into nostalgia*, I just have to recommend you (actually, recommend to Noah) an enlighting book about Basic that my parents bought me when I was a child, and that I think it fits perfectly with the desire of your son of fullfilling his “game-building” abilities. Luca Novelli published in the 80s two books called “My first book about Basic” and “My first book about Computers” [1], which are specifically intended to introduce computers and programming to children. After an introduction to algorithms and flow diagrams, the book dedicates a full page to each (GW)Basic instruction, providing an easy-to-understand explanation and -even more important- a small code example (~10 to ~50 lines) in the form of a game. This means that the whole book is a compendium of interesting games (guess the animal, guess my age, pick a number) that slowly build up knowledge without being boring or pushy, and gives the child tools to build his own games. It may look outdated, but programming hasn’t changed that much since K&R C, so most of the concepts are still relevant today. Sadly, the few page scans I could find are in portuguese or spanish (my mother tongue), but they will serve as an example of the pedagogical approach. I hope you can find an English copy on Amazon, as it is IMHO an excellent way to teach & learn programming. [1] “Two children, a dog, and a personal computer explore the history, concepts, and uses of computers, identifying such aspects as binary systems, computer languages, programming, and memory.” https://www.amazon.com/My-First-Book-About-Computers/dp/0914845853 Instructions, strings and numbers https://cloud10.todocoleccion.online/tc/2013/10/09/PA0900055.JPG FLOW DIAGRAMS — AND instruction https://pbs.twimg.com/media/DLhzcb3WkAEVrF3.jpg IF THEN GOTO instructions https://cdn.wallapop.com/images/10420/39/59/__/c10420p196760441/i440125291.jpg?pictureSize=W640 LIST and LOAD instructions https://cloud10.todocoleccion.online/tc/2013/10/09/PA0900075.JPG Basic and Binary https://cloud10.todocoleccion.online/libros-segunda-mano-informatica/tc/2014/06/22/13/43931184_20627875.jpg More: https://twitter.com/eduo/status/782934202572472320 http://www.lucanovelli.info/2015/10/07/amici-lettori/
I coded many interesting things in QBasic in my childhood, way before the Internet era: a point-and-click GUI like windows 3.x, a compression format that I thought was a marvelous. Later in my life I found I had “invented” Run-Length Encoding, haha.
Mark says (May 28, 2018 at 8:01 pm):
Your code has a bug in it, but your son’s looks great! When I was starting I learned Fortran77 and GWBasic and I had a conversation with a US government Computer Department (wasn’t called IT back then) about the two. It went like this… Me: We should use BASIC to get all these neat functions. GOV: Fortran is flexible and you can have libraries to do all that. Me: So, where are all those functions in your Fortran libraries? GOV: ……..crickets Basic had the quick response a programmer loves, but a few very bad qualities like line numbers or all CAPS and “$” characters allover. It didn’t help that the UI was always non-graphic and ugly with terrible mouse use.
Alessandro Nazzani says (May 29, 2018 at 10:15 am):
I can’t comment on how accessible it will be since it hasn’t been released yet, but if your son has a Nintendo Switch, you might consider looking into FUZE.
JQB45 says (May 29, 2018 at 4:31 pm):
Calling Quick BASIC, QBASIC is incorrect. Quick BASIC is much more powerful and sort of compiled where QBASIC is just interpreted.
I say that about Commodore 64 BASIC. Same ‘problems’ as QBasic I suppose. Download a C64 emulator and you are ready to program. Graduate to Assembly when you are comfortable – I learned 6502 Assembly when I was 15 or so, just out of curiosity (the C128 had a built in assembler). Don’t fear the GOTO! It’s a great step before learning about functions.
I found this on a DuckDuckGo search about “arrogant programmers”, and trust me, being a Linux user, I ran into my fair share of them. Ah… QBasic. I remember writing a lot in that, after my TRS-80 Color Computer (26-3002, 16K with Extended Color BASIC–I got a replacement one off eBay nearly 20 years later… But that’s another show, as Alton Brown, a Cooking Channel staple, would say) blown its 6809 processor. The documentation for the BASIC language with any Tandy computer of its time was concise and pretty much like the “Dummies” books of today (even the Model I Level I BASIC packed in every box had a well written manual). Even the QBASIC manual that came with my MS-DOS disks was of the same quality. (And written by David A. Lien, nonetheless!) I still program in Basic. On my Tandy Color Computer 2 (what I got as the replacement to relieve my childhood from eBay — I’m 41 now) and on Ubuntu with a similar language that’s almost similar to the Microsoft dialect of BASIC from the Canonical repos. Yeah, call me old school. But I’m not alone. There’s a small group online of Tandy Color Computer enthusiasts. I am one of them. We still program in BASIC. It might not be as powerful as C and its offshoots, or whatever, but one thing I liked was when I found a copy of “500 POKEs, PEEKs and EXECs for the TRS-80 Color Computer” in a thrift store a few months ago, it was like getting my hands on the holy Grail. I don’t know Motorola 6809 assembly, nor do I know i386/x86_64 assembly, or much C, Java, whatever, but Basic.. oh yeah. And a few well placed POKEs and EXECs in a couple of lines of BASIC code can make a difference. Thanks for this post. I’m glad I ain’t alone in saying: BASIC IS THE BEST!
Last year, I was trying to teach my 2-year old son to go up the stairs using both feet. He would get his right foot up and push on his right leg with enough strength to lift himself up, but strangely never use his other leg. I remember feeling somewhat frustrated:
OK now the other leg! No, no, not that one! …
I tried a few different things over a period of weeks, but ultimately, it was positive reinforcement that did the trick. After using his right foot on the first step, I cheered him up and complimented him:
Allright, great job buddy, way to go!
He paused for a brief moment as he listened to my cheers and then, out of nowhere, lifted his other leg, and climbed another step! I cheered even louder as he started going back and forth. My son was more driven by positivism than by other means of education.
Applying this concept to software engineering can be very valuable. Code reviews usually solely focus on what needs to change, and it can sometimes feel disheartening when lots of things need changing. Taking the time to highlight the good parts during code review usually yields faster reaction time and quality response. To praise someone’s piece of code shows appreciation for one’s intellect. It increases self-esteem and confidence, it boosts morale and generates a desire to become a better coder.
7 Comments
Byron says (December 23, 2014 at 10:06 pm):
I really enjoyed this post. It’s nice to think that people can be happier and more productive with a little positive feedback. I wonder if part of the trick is not just that you’re cheering them up, but that you’re showing them which parts of their own code to model their revisions after. While we can explain what we’re looking for in our own words, surely it’s easier to repeat your own successes than someone else’s.
Nicolas Bize says (December 23, 2014 at 10:42 pm):
@Byron: Thanks for your comment! While I agree with you, I’d say that both actually probably go hand in hand. When people take the time to understand what you did right, you are most likely to respond positively to their criticism as well.
Sean says (December 23, 2014 at 11:29 pm):
Hey there, I’m glad you’ve found such positive results! This is quite interesting, I’m a medical student and we are often taught to use the Pendleton model of feedback. This works in the same manner as you have mentioned here: citing positives, and then negatives. It’s great that you have found the same solution in your own way. Shows that there must be some genuine evidence for it being useful!
Nicolas Bize says (December 24, 2014 at 2:03 am):
Hey Sean, thanks for the insight! I just read some articles written by Prof. Donnelly and Mr Kirk about the subject. Very interesting 🙂
Aivar says (December 24, 2014 at 10:01 am):
Thanks for the post! I’m a programming teacher and it inspired me a lot!
Kent says (December 24, 2014 at 10:22 am):
I just recently finished reading How to Win Friends and Influence People, and much of what it suggests is inline with your experiences. I can highly recommend the book if you’ve not read it. I’ve been trying to apply the positive enforcement ideas to my own life (esp. 2 kids) and have had a little bit of success so far. Thanks for your post because it is additional encouragement to keep trying (it’s not easy focusing on the positive when you’re so used to being negative).
Lars Clausen says (December 24, 2014 at 1:35 pm):
Very well written, and correlates well with my own experience. Following this would be a great new years resolution. Wrt comments on the internet being mostly negative, here’s a twist on it: Many photographers will post their photos and get mainly comments along the line of “great shot”, “wow”, “+1”. While obviously better than “that sux”, they are not very useful for getting better. Comments that point out specific negatives are downers, but can be learned from. Comments that point out the parts that are done well and what could be done to improve other parts are pure gold, uplifting and educational at the same time. The Critiques section of yore on Luminous Landscape was like that, extremely educational – see e.g. http://www.luminous-landscape.com/critiques/september-2002.shtml
About a month ago, I blogged about my love/hate relationship with Eclipse. I was asked by a few people to share my tips on how I was able to speed it up over time:
Note: This assumes that you already have an SSD and at least 8Gb of RAM. If not, look no further and upgrade your hardware.
Tip 1 : Always run the latest JDK and Eclipse.
New JDK and Eclipse versions include fixes and optimizations from prior versions. Make sure that you are using the 64 bits version of Eclipse and of the Oracle JDK. For any web development, you will want to use Eclipse for Java EE and not Eclipse for Java.
General > Startup and Shutdown : remove all plugins activated on startup
General > Editors > Text Editors > Spelling : Disable spell checking
General > Validation > Suspend all
Window > Customize Perspective > Remove stuff you don’t use or want (shortcut keys are your friends), same for Menu Visibility (how many times have you printed a source file…)
Install/Update > Automatic Updates > Uncheck “Automatically find new updates”
General > Appearance > Uncheck Enable Animations
Stay with the default theme. Anything else makes it slow.
I personally turn off autosuggestions so that they don’t slow down my typing. Instead, I manually trigger the auto suggestions using Ctrl+Space when needed. This is done through:
Java > Editor > Content Assist > disable Enable Auto Activation. Advanced > Remove all unwanted kinds
Tip 3 : Keep your JDK on a RAM Disk
A RAM disk is a virtual disk or hard drive that is stored into the computer’s memory. It boosts the I/O performance on anything that is on it. Creating a RAM disk uses your RAM even though it just appears as a drive on the computer. Because the memory used will be reserved for the disk and become unavailable for other programs, we will only be putting the JDK on there. 300MB will be enough.
Warning: Don’t put anything permanent on the RAM Disk, it will be erased/recreated at each reboot.
Create a new batch file, for example: ~/tools/batch/ramdisk.sh Replace x, y, and z with the JDK version you have installed on disk:
1 2 3 4
#!/bin/bash diskutil erasevolume HFS+ 'JDK RAMDISK' `hdiutil attach -nomount ram://614400` cp -r /Library/Java/JavaVirtualMachines/jdk1.x.y_z.jdk /Volumes/JDKRAMDISK (Note that diskutil expects the number of 512 bytes sectors to be allocated: for 300MB, 300 * 1024 ^ 2 / 512 = 614400)
Save your file and make it executable:
1
chmod 755 ~/tools/batch/ramdisk.sh
Now run ramdisk.sh to create the RAM Disk:
1 2 3 4 5 6 7
$ ramdisk.sh Started erase on disk4 Unmounting disk Erasing Initialized /dev/rdisk4 as a 300 MB case-insensitive HFS Plus volume Mounting disk Finished erase on disk4 JDKRAMDISK
You should now see in Finder the new device called JDKRAMDISK containing your JDK. You can remove the RAM Disk and free its memory by clicking on the Eject button:
You will always need to have the RAM Disk in order to launch Eclipse (otherwise you will see the error A Java Runtime … must be available in order to run Eclipse). You can configure your system to run the ramdisk.sh script automatically upon startup using Automator or using a launchtl daemon.
Create a new batch file, for example: C:/tools/batch/ramdisk.bat
Replace x, y, and z with the JDK version you have installed on disk in the following script:
1 2 3 4 5 6 7 8
@echo Placing JDK on Virtual Disk N:/ @echo off sc config imdisk start= auto net start imdisk imdisk -a -t vm -s 300m -m n: format n: /q /Y call xcopy C:\<path_jdk>\jdk1.x.y_z N:\jdk1.x.y_z\ /S /E /Y /Q label n: JDK RAMDISK
By running ramdisk.bat, you will have created a new disk N: labeled “JDK RAMDISK” that will contain your JDK.
Make sure the file is run as an Administrator. Right click on the file, go into Properties and check Run as Administrator.
You will always need to have the RAM Disk in order to launch Eclipse (otherwise you will see the error A Java Runtime … must be available in order to run Eclipse). You can configure your system to run the ramdisk.bat script automatically by placing the script into your Startup folder.
In order for Tip 3 to work, you will need to add the -vm setting in eclipse.ini (see next section)
Tip 4 : Tweak your eclipse.ini
Locate your eclipse.ini file:
Windows/Linux: $ECLIPSE_HOME
MacOS: $ECLIPSE_HOME/Eclipse.app/Contents/MacOS
Eclipse.ini contains 2 types of properties: properties relative to the Eclipse application and properties relative to the JVM. Those options are different depending upon your version of JDK or Eclipse. Here is the most up-to-date list I was able to find online.
Oracle’s JVM memory is divided into multiple memory pools where objects reside with time:
The Eden Space (heap) provides the memory for most initial objects. The Garbage Collector passes often through this space containing objects of “young generation”. It removes any objects that hasn’t been used for a while.
The Survivor Space (heap) contains the objects that have not been destroyed after 2-3 passes of the GC in the Eden Space. They are still part of the “young generation” but have moved to a much safer place where they have less chances of being destroyed: the Garbage Collector passes much less often there (it assumes from past experience that objects are used more frequently).
The Tenured Space (heap) contains the objects that have been in the Survivor Space for a while.
The Permanent Generation (non-heap) contains all the metadata about of the JVM, such as the class properties, methods, enums, etc. Because that data can be shared accross multiple JVMs, the permanent generation has read-only and read-write areas.
The Code Cache (non-heap) provides the memory used for compiling and storing code.
Oracle wrote a great article about garbage collection tuning.
The sizes for all those memory pools can be tweaked in eclipse.ini. I currently have 16Gb of RAM, but these settings will work fine with 8Gb of RAM.
This basically skips the verification of class files (described here) aka the JVM won’t be able to detect the authenticity of the class files you are using. This poses a security threat if the compiled files have been altered so use at your own risk.
turn on performance compiler optimizations
1
-XX:+AggressiveOpts
increase permanent generation space
1 2
-XX:PermSize=512m -XX:MaxPermSize=512m
increase min and max heap sizes
1 2
-Xms2048m -Xmx2048m
increase heap size for the young generation
1
-Xmn512m
set stack size for each thread
1
-Xss2m
tweak garbage collection
1
-XX:+UseParallelOldGC
Tip 5: Get your anti-virus outta here
If you have an anti-virus, make sure that it doesn’t interfere with your code folders. Add the JDK folder, the Eclipse folder, your .m2/jar repositories, and your code folders to the antivirus whitelist.
Tip 6: Keep SVN and GIT out of Eclipse
This is really a matter of personal preference. Some will like the Eclipse integration with the collaborative team tools. Personally I find they tend to make Eclipse slow and aren’t a good replacement for GIT/SVN CLIs.
Tip 7: Use your keyboard
Everything in Eclipse either has, or can be assigned a keyboard shortcut. Take some time to learn them and customize to your liking. I personally find that I can be more efficient when my hands don’t have to leave my keyboard.
A few important ones:
1 2 3 4 5 6 7 8 9 10
Ctrl+Shift+R : jump to resource Ctrl+Shift+T : jump to class Ctrl+. : jump to next error Ctrl+Shift+G : search for references Ctrl+Shift+P : select matching bracket Alt+Arrows : go forward / backwards Ctrl+Space : autocomplete Ctrl+Shift+F : format source Ctrl+Shift+O : organize imports Ctrl+D : delete line
If you have any other tips, I’d love to hear about them!
21 Comments
Zappa says (November 27, 2014 at 11:03 pm):
Great tips. Personnaly, my two favorite shortcuts are : – Ctrl+O to jump to any field/function in the current file. – Ctrl+Alt+R while being on any field/function to rename it. Also, I don’t like GIT inside Eclipse. Kinda not work like I want, or maybe I don’t use it the right way.
Thanks for the tips. Small correction: Validation is a root category, not a subcategory of General (at least in Luna). Also, here’s another tip that has made Eclipse more bearable: remap Ctrl+Tab to the “Next Editor” command. This will allow you to switch back and forth between two documents by using Ctrl-Tabbing, similar to the behavior of some other popular editors.
One more thing: instead of using the -vm option, I simply copy the JDK ‘bin’ directory to my virtual disk in my startup script and then create a symlink/junction to this directory inside the JDK directory. The benefits are (1) you only consume 3MB of RAM instead of 300MB, and (2) any other application that relies on JDK ‘bin’ will also benefit.
Karsten Thoms says (September 18, 2015 at 11:41 am):
Nicolas, a really great and useful post! I am personally interested in getting the most out of Eclipse’s speed and will give a talk at EclipseCon Europe this year about that: https://www.eclipsecon.org/europe2015/session/boosting-performance-your-eclipse-ide Your post was a valuable, if not the most valuable, source of inspiration. I will give reference to it on my slides. I recognized a minor issue: The option “-XX:+CMSIncrementalPacing” you are mentioning is ineffective, it is a setting for the Concurrent Mark and Sweep GC. But you are activating exlicitly another GC, thus CMS is not active. Actually there is the next error, you both mention “-XX:+UseParallelOldGC” and “-XX:+UseG1GC”. These are two different GCs and the JVM won’t start with both options. When using G1GC it is not recommended to set the Young Generation size with -Xmn. There is a good article about benchmarking different GCs: http://blog.mgm-tp.com/2013/12/benchmarking-g1-and-other-java-7-garbage-collectors/ Last issue: The option “-XX:MaxGCPauseMillis=10” is mentioned twice. Personally it does not work on my Mac to move the full JRE to RamDisk and reference it with -vm. The JVM refuses to start, it does not find a dylib then. Therefore I only moved rt.jar to RAM and make a symbolic link to its representation on RAM Disk. It is of course useful to store more on the RAM Disk: Read-only files (esp. Plugin Jars) and temporary data (Local History, JDT Index, Build output folders). The problem with Build Output is that you have to use symbolic links and create them with scripts when working in a team, since other team members might rely on the fact that the output folder is local to the project location. Best wishes, ~Karsten
Favorite Eclipse shortcut, especially for very large projects. shift+cmd+r = Open Resource (file finder , with wildcards!) 2nd fav , especially for very large files cmd+o = Open method list , do it again and you get inherited members
Michel van Leeuwen says (October 29, 2015 at 3:37 pm):
Great tips! about: Tip 6: Keep SVN and GIT out of Eclipse I agree. (I use git command line). How do I remove it? (i see it’s marking changes… so it’s somehow activated, maybe by me a while ago)
Jeroen says (November 24, 2015 at 9:19 pm):
Saving of the settings file was taking ages. Apparently this was caused by xml validation settings. Probably the setting “Check full XML schema conformance” under XML > XML Schema Files
robert says (January 2, 2016 at 2:09 pm):
Nicolas, thank you for taking your time to write a nice and useful tutorial. I’m trying to set up eclipse to get the jdk from the ramdisk, but I get an error when trying to launch it: “To open eclipse you need to install the legacy Java SE 6 runtime.”. I applied the correct path in eclipse.ini and checked if the files are in there, everything should work, but somehow it doesn’t. I’m on a macbook running el capitan. Any thoughts? Thank you!
mcahornsirup says (September 29, 2016 at 11:51 am):
Great article, same issue … any ideas?
Lakshman says (January 7, 2016 at 3:15 pm):
What a nice article. finally my eclipse is good for programming.
Luca says (April 13, 2016 at 12:03 pm):
I find the post extremely interesting and I would like to ask a question: if I have a workstation with a really fast SSD drive where I install everything, i.e. Eclipse and JDK (in my case also python since use python), do you think that the process you have proposed will still provide some gain in performance? Thanks you Luca
Andre Paschoal says (October 17, 2016 at 12:34 pm):
Nicolas, thank u so much for the awesome tips. Does anyone know how to make “class members” disapear in “Project Explorer” view ? Thanks!
Thank you! I’ve been trying to figure out how to make Eclipse tolerable, but since I’m so new to the environment, all of the posts I read were -unhelpful-! I didn’t do every step (failed on the 8GB thing, for starters), but it now loads in about 30 seconds as compared to 5 minutes. Thank you!
Jief says (September 25, 2017 at 9:08 am):
With java 8, I needed a “rsync -a” instead of a “cp -r”.
il Barto says (October 7, 2017 at 4:05 pm):
Great article! I was annoyed by poor eclipse scrolling performance in MacOS Sierra, found several posts in different forums blaming Cocoa implementation and saying there was no solution, but applying just your 2nd tip improved response time and made my IDE usable. Thank you!
Saharsh says (December 16, 2017 at 10:41 am):
Very useful! Tip 2 alone made it blazing fast (at least in comparison to earlier). Thanks for posting.
A few weeks ago, I stumbled upon a database schema that had been created by a solo engineer who worked in isolation for months. All tables were 3-letters long, with up to 30 columns that had 3 letters each. No-one understood what was going on, we had to restart the whole thing from scratch…
Code that has been entirely designed and authored by a single person often produces code smells and architecture pitfalls. If you are doing it alone, you are most likely doing it wrong. There is simply too much value in having code go through proper code reviews.
When one writes code meant to be shared and seen, one becomes more concerned about its quality, testability and correctness. Readability improves, because there is a desire for code to go beyond the author’s scope. Feedback from others makes greater coders over time. This is where open source software can really shine.
Don’t code alone in the dark. Great code is always refined through the fire of analysis and criticism.
17 Comments
Mario Prawirosudiro says (November 25, 2014 at 7:29 am):
It’s scary how true this is. When we code together with our peers/colleagues/coworkers/whatever, we’re under constant pressure to keep our code clean, whether we realize it or not. Once we’re left alone, our exploratory instinct kicks in, and we start playing with code, neglecting quality for quick solutions, so that we can get to the next challenge, and so on. I think this is the reason why pair programming is trending right now, and why most coders ‘feel’ they’re more productive in such environments.
Nicolas Bize says (November 25, 2014 at 8:13 am):
I think you’re right!
Jonas Hammarberg says (November 25, 2014 at 8:05 am):
Being the only programmer in the company doesn’t leaves much choice but code “in the dark”. On the other hand — being the only one also means that I’ll have to maintain my own code, even 10+ years after it first saw the light of the day. And that’s not possible without taking really good care of the code. Besides, as a bonus I get to see how much I improved during the years as I, almost, always sees a better way to accomplish nowadays. Sincerely /Jonas
Nicolas Bize says (November 25, 2014 at 8:26 am):
Hey Jonas! Having worked for a tiny company at one point, I completely understand your case. And I think that it’s great that you are taking care of your code knowing that you will be the one maintaining it later. However there is so much benefit to being able to share your code with others. Would your company agree to open source some of the things that you code? Do you still find time to work on some collaborative or open source projects on your spare time? I can really tell you from experience that it will be a trumendous gain for you as a coder. Good luck, and thanks for reading! 🙂
Phil Murray says (November 25, 2014 at 11:31 am):
You are NOT your code!!! Most of us try to do the best we can out of a sense of pride but due to the time and financial constraints of the real world this is sometimes not possible, especially in smaller companies. Does this lead to technical debt? Absolutely, but sometimes this is unavoidable. Be pragmatic and do the best job you can. Finally, the developer that created that database schema needs shooting.
Doug says (November 25, 2014 at 12:54 pm):
I would LOVE for others to look at my code. There’s little question that some knowledgeable programmer would reveal things that would leave me wondering why the heck I didn’t think of that to begin with. But I’m producing a prototype for a niche product that few others even understand the need for (because they’re not active users of this kind of software), I know how the entire integrated program must operate in order to have a chance in the market, and I’m painfully aware of how important it is for code to be as self-explanatory as possible — because I have to find and correct my own bugs. No one else has any incentive (financially or interest-wise) to look at my code, so finding someone qualified to analyze it is darned near impossible. On earlier coding projects, the pitfalls of shortcuts became very obvious, so I avoided most of those earlier errors in this project. But I’m certain that another pair of eyes on this would be enormously beneficial. So I absolutely agree with the author’s point here — while fretting that there’s no way to include that insight in my current project.
Eric Bishard says (November 26, 2014 at 11:50 pm):
I am a novice .Net developer, I felt the same way. Until I decided to start reaching out. I have a Twitter account with almost 500 followers. That’s not a lot, but they are almost all .Net developers and front end developers. There are three different way that I have reached out and found others to review my code. 1) Post a status message on Twitter that says: “Looking for a .Net Mentor, someone to share a screen and talk code with”. I got two takers right off the bat and I’m talking to one of them on Skype as I write this and he has helped already in helping me refactor and think about my code differently. 2) I take Pluralsight courses and ask questions to the instructors. 3) I have read some articles I really like online and reached out to those people and asked them to help. In each scenario I have found others that were willing to look and some that were willing to stick around. Just put it out there, ….. ask.
Nicolas Bize says (November 26, 2014 at 11:57 pm):
Thanks for sharing that thought, I agree 100%. Developers are a weird species but when asked genuinely they are almost always there to help out, especially when asked for feedback. I’ve never had a bad experience myself.
Tony Dunsworth says (November 25, 2014 at 3:31 pm):
I also an a one man shop, but I asked I’ve of my colleagues who used to program years ago to review my code to ensure that I kept it as clean as I can. It also seemed to help by having sometime who isn’t a daily coder look at it forces me to explain my code and I can catch things I missed, even if he didn’t.
I don’t know – I’ve only worked one place where we even had code reviews. I consider my style of development SODD (Stack Overflow Driven Development). So, even though I’m “alone” in a sense, I really draw from the “wisdom of the crowd” to try to stay on the “straight and narrow.”
Frans says (November 25, 2014 at 5:49 pm):
I agree and disagree. What you are writing is true for a lot of programmers. However: a really experienced programmer can perfectly write quality code without the need of code-reviews. Frans.
Nicolas Bize says (November 25, 2014 at 6:26 pm):
Of course, I never implied that because one is writing code in a solo process it will necessarily be bad code. In that sense the term “code smell” is incorrect. However, any code produced by an experienced programmer will be of higher quality if 1/ written in the intent of beeing visible code and 2/ the code is discussed with others.
Ron says (November 25, 2014 at 8:56 pm):
…and any experienced programmer who believes their un-reviewed code to be perfect, is probably deluded. Ron
Suraj Soni says (November 26, 2014 at 4:28 am):
thank you for sharing this great thought..nice
Allan Jes says (November 27, 2014 at 7:34 am):
Thanks for this insight. Indeed as coders we are weird! I am currently on 3 php mysql projects but unfortunately what you are stating is exactly what I have been doing for the past 3 years. I try as much as possible to be clear in code and do the documentation but I agree, we should always let others review for us. For my case time and budget constraints factor in since ours is a small private company. Though we are two, I take on the senior developer role most times, but it is really disturbing when I have to be called upon each and every time to rectify a ‘simple’ bug.
Gordon says (April 28, 2016 at 8:14 pm):
This is the first blog I’ve read all of and enjoyed! Really good points, there’s always a bigger fish and your code can always get fatter! ;D I work in a team of 11 and only two of us can code, everyone else is a designer but you’ve spurred me on, I’m going to try get some code review’s set up! Thankyou!!
Searching a code base for “TODO:”s is a quick and easy way to measure technical debt. Reading through them often feels like going to a museum, with lots of names from people that have left the codebase a long time ago. Github currently lists more than 51 million TODOs.
I’ve come to realize that TODOs rarely get accomplished. The ones that are really critical usually get done while the rest gathers dust and becomes unnecessary technical debt.
I’m in favor of not using TODOs altogether. Leaving TODOs everywhere is like publishing incomplete code. It’s just as ennoying as someone starting a sentence and never
I believe that this is the greatest time to become a programmer. Whereas I remember paying 149$ for an undocumented Microsoft Visual C++ 1.0 twenty years ago, almost all languages and tools have now become extremely accessible, free and well documented. The amount of information that one can find online is bewildering. We now speak in exabytes. There are more tutorials out there than you could read or watch in your lifetime. As a coder, I also doubt that you will find many algorithms in your code that have not already been analyzed and cleanly displayed online. To illustrate this, StackOverflow currently has about 8.3 million questions. 8.3 million… Just think about it for a second… There are 48 times more questions than the number of words in the English dictionary! And while this includes many duplicates, there are still new questions pouring in every day. This means that any time I have a question on any specific code subject, I can be 99% sure that I can find a perfect and constructive answer on StackOverflow along with instructive comments. And while this is in part a wonderful thing, I think that this has turned a lot of us into code zombies, coders who reach their objective without understanding the problem or thinking about the solution.
Like a growing disease, I feel that this has become a growing trend. With so many quality answers at our disposal, developers quickly make the huge mistake of taking away the most constructive part of the problem solving equation: the path leading to the solution.
Now, I am an utter fan of Jeff Atwood and Joel Spolsky. I was closely watching as StackOverflow was being built and seeing their hardware specs, I believe that it is one of the greatest website implementation of all times. I am in no way encouraging you to stay away from it. But if jumping to StackOverflow is the first thing that comes to your mind when faced with a new problem, you are clearly missing out on the best part of programming.
A lot of people tend to rush to StackOverflow for every question they have. Some even hope for a nice prebuilt jsFiddle where they can view the results before even looking at the code. They justify this by time constraints, or by not wanting to waste energy reinventing the wheel. They wrongly believe that they would be wasting time by finding a less-optimized solution than the most upvoted answer out there. They merely think about the problem, and tackle each new algorithm like someone who solves crossword puzzles with the answer page left open. They are delegating the research part of their jobs. While they may still be learning a bit by looking directly at solutions, they learn a lot less, if not nothing, compared to the ones who go through the “painful” process of laying down the problem, thinking about the solution, coding the answer, testing it out, optimizing it and then comparing it with the top answer from StackOverflow.
Bringing research back into your code.
A coder can only become a master of his craft through time and experience, tackling each problem through solution-seeking, testing, error making, hitting walls, going through eureka moments, rebuilding wheels, compiling, and perfecting its own code. Not only do I think that each step is crucial as a learning experience, I also believe that it is vital for personal satisfaction and well-being. In fact, I truly believe that a coder can only be satisfied with its job when the latter stimulates its intellect and forces him to learn something new every day. Depending upon your current tasks, you may or may not be faced with a lot of unknown each day. Here is my personal approach to the problem :
When faced with a new problem, don’t hop on the Google wagon right away. Give yourself at least 10 minutes to try and solve it by yourself. Take a piece of paper, draw the solution, open a source file, code, compile, test. 10 minutes is not a lot of time, and you will quickly see that the investment pays off.
When looking for information, look first at the official documentation instead of trying to find the direct answer on StackOverflow. The docs usually give detailed and updated information that will help you understand what needs to be done to tackle the problem.
When you find something useful, write about it. Keep a journal, a blog or some written notes about your discoveries.
When giving out a solution on StackOverflow, do not just spit out a jsFiddle answer. Point towards the right direction, write in pseudo-code, help the coder help himself.
If you have become weary of just gluing code together or feel like a zombie writing code, I promise that if you strive to bring research back into your code, you will discover a renewed, instructive, and rewarding experience.
I think a lot of the issues with being a “code zombie” are a by-product of things being made easier and easier. Users are given these amazing frameworks that hide some of the more challenging tasks and just aren’t used to needing to actually SOLVE a problem themselves. While things being made easier isn’t necessarily a bad thing, it’s the fact that a lot of developers don’t take the time to dig into problems – instead they get so hooked on the idea of things being made easier that they just look for the answer instead of trying to figure it out themselves. I talked about the idea briefly in an article I wrote on my own blog: http://xangelo.ca/#!/2014/7/the-straw-that-broke-the-camels-back
Weng Fuzhoudong says (November 5, 2014 at 12:07 am):
Your point not correct if developer use soft with good design spirit. Microsoft Visual Basic 6.0 is only soft with good spirit. Possible make big application as fast as can write code without mistake.
Da Nang says (November 5, 2014 at 2:29 am):
I have to disagree. Most of questions on StackOverflow are not problem solving, but more about how to do a specific thing in a specific context, e.g. how to accomplish something using the Spring framework or how to allow user’s file upload using Servlet. Those questions require little or no thinking at all, rather, they require the experiences and knowledge of the persons who actually worked on it to produce the optimal solution (usually means which class/library to use). StackOverflow is a kind of cheat-sheet, it helps you find common, best practice solutions (mostly code snippets) without you having to dive into lengthy documentations or trial and error. And you can always improve their solution or provide your own when it is not up to your expectation. I think, and believe many people will agree with me, you as a programmer should concentrate your effort in solving your or your customer’s unique problem in the best way possible. That’s is where you need a piece of paper and brainpower. Leave your wheel re-inventing for later. If you would like something more problem-solving focus, more helpful for programmer’s learning, or, in your own word, less “zombie”, head to SO’s sister site: programmers.stackexchange.com
Circuitbomb says (November 5, 2014 at 4:11 am):
All of the questions on stack overflow seek to have a problem solved. The problem being something the person asking the question can’t seem to solve for themselves. The context doesn’t matter. Regardless of the code you re-use from SO, you should always double check it for soundness as it relates to your specific usecase – it doesn’t matter if it’s a snippet with a million upvotes or sponsored by Dev #182736 from Big Company D as a best practice.
Da Nang says (November 6, 2014 at 3:55 am):
If you want to be strictly semantic, then yes, even the question “how to print a text to the console in Java” is a problem-solving question:) But my point was, what problem is worth your effort to figure out yourself. And what is trivial enough its better to just re-use other’s code. And, you don’t need to ask a question to get the information, because like the author said, 99% of the questions you might ask already had answers there. On SO, of course upvotes or accepted answers are not absolute measurements of an answer’s quality, but they are the first signs you should look at to filter out low quality ones. Whether you believe it or not, a 100-vote asnwer is always better then a 10-vote answer. Granted, any sane person would then verify that the best answer is really the best for their needs. Not only that, he will apdapt the code as needed for their specific use case. And like I said, readers always can improve upon an answer, or provide one themselves. In summary, StackOverflow is one of the best things that ever happened to developers. Use it. Contribute to it. Make the best out of it. Have priorities, spend efforts on what matters.
Da Nang says (November 6, 2014 at 4:04 am):
Disclaimer: I have no affiliation with StackOverflow or any of its affiliates. I just happen to be one of its enthusiastic users, like many other does, after moving from other Java developer’s forums like JavaRanch, TheServerSide, etc.
Taylor Marks says (December 3, 2014 at 7:09 pm):
I disagree with this in two ways: 1 – “Give yourself at least ten minutes.” Wrong. Make an attempt at the code. Until you have code which you think should work, you’re not ready to post a question on StackOverflow. If you haven’t done that yet, you have a 90% chance of your question being closed as Off Topic (Looking for a Resource), or Too Broad, or Not Clear. Time doesn’t matter. It doesn’t matter if you spent 10 seconds or 10 days. All that matters is if you wrote code that you thought would work (or at least pseudo code with an algorithm that you think will work.) 2 – “When giving out a solution on StackOverflow, do not just spit out a jsFiddle answer. Point towards the right direction, write in pseudo-code, help the coder help himself.” Again, wrong. If someone does what you say, that answer will be deleted for failing to answer the question. If you feel like you need to teach the person how to ask questions first, you don’t – if they failed to properly ask their question, vote to close it if you can, or flag it if you can’t.
Nicolas Bize says (December 3, 2014 at 7:23 pm):
Seems to me that you don’t agree with a lot of things you misread (or I misexplained):
The issue at hand is not with posting a question, it is looking up the answers without thinking about the problem. So basically my advice is to not jump on the SO for answers right away. Give yourself 10 minutes to try and find the solution yourself, by wording it out or “make an attempt at the code” like you said.
It’s not about teaching the person “how to ask questions”. You can have a perfectly asked question. To which you can either 1/ give out a fleshed out code snippet ready for CtrlC/CtrlV, 2/ explain the solution using words, describing the problem and the algorithm necessary to solve it, linking associated docs, and potentially including code parts for tricky portions. My advice is to always go for 2/ instead of 1/, even if it is not as reputation-rewarding.
StackOverflow is a rather useful resource for programming noobs who can withstand the hostility of the StackOverflow “establishment”. It’s increasingly useless for programming experts, though, as difficult questions are rarely answered and many of the best questions tend to get closed for the most arbitrary reasons. So if you’re an expert, you’re likely to end up having to reinvent the wheel over and over anyway, because nothing you’ll find on StackOverflow will be useful and any questions you ask yourself are unlikely to ever get answered. See also http://www.embeddedrelated.com/showarticle/741.php
Last week on my NAS I found some old code that I had created about 2 years ago. It was a small (7kb) vanilla library that enabled you to make progress bars out of your browser tab icons. I never released it because it was so similar to piecon. However it seems that piecon hasn’t been updated for the past two years. Since my library has a bit more configuration options, I thought I could brush up some documentation and open source it for anyone to use.
The animation/rendering/processing slows down considerably if you observe it from another focused tab. Is this behaviour on purpose?
Nicolas Bize says (October 16, 2014 at 3:57 pm):
It’s not. I think the behaviour also depends on which browser you’re using. It seems like Chrome has some memory issues with the favicon behaviour, while Firefox behaves much better. I’ll see if I can improve some of that.
Fantastic! Pretty sure I’ll use it on next projects.
othmar says (December 25, 2015 at 1:40 pm):
great library – thank you! unfortunately i had to hack around for having an play/pause icon as an overlay like the animated mixcloud favicon. would this be possible without hacking your core-lib?
Bruno Jesus says (September 21, 2016 at 4:32 am):
Thanks for your work, it works very well together with upload progress. The only problem I have is that it does not respect updateTitle = false. The problem is that in the code you do at line 336: updateTitle = cfg.updateTitle || updateTitle; cfg.updateTitle is false so it will OR the condition and use the default. Should be changed to something like: updateTitle = typeof cfg.updateTitle != ‘undefined’ ? typeof cfg.updateTitle : updateTitle;
Bruno Jesus says (September 21, 2016 at 4:33 am):
Typo in my last comment, should read: updateTitle = typeof cfg.updateTitle != ‘undefined’ ? cfg.updateTitle : updateTitle;
One of my most memorable experiences in software development occured to me eight years ago when I started working for Airbus. I was fresh out of college, all pumped up with my master’s degree in engineering. As a self-taught programmer, I had been swimming in code for 15 years prior but was still clueless about how to produce great, maintainable code. The main issue with someone that is overcome with pride is that it always finds itself faultless, rejecting any type of failure onto something or someone else. For me, 8 years ago, it was always Eclipse’s fault.
In an effort to reduce costs, Airbus started shifting their software development from Microsoft to the Java open source ecosystem. While familiar with C/C++ at the time, I only downloaded Eclipse for the very first time in 2006 at Airbus.
As an advocate of Microsoft products, Visual Studio was to me the pinacle of the IDEs, making the transition to Eclipse incredibly painful. It was slow: autocomplete would take multiple seconds, it would often freeze… The integration with Maven was never working. The layout was awkward. Spell-checking ON but line numbers OFF as defaults?! I was repulsed by it. Everything about it made me feel like it was created at the time when dinosaurs were still on the earth. I hated my job for having to use Eclipse. I was a miserable coder who knew deep inside that it was all Eclipse’s fault. I thought that things would get better with the days, but they didn’t. I kept dreaming about creating the site http://www.ihateeclipse.com/ three years before it was even born.
Two weeks had passed when a coworker passed by my desk and heard me curse at the IDE. He asked if he could help. I replied that nothing could be done: “Eclipse is just being a piece of *junk* once again.”, after which I engaged in a long 10 minutes rant about how awful Eclipse was, and how it diminished my abilities as a programmer.
He listened carefully and then asked if he could take a look. He picked up a chair and grabbed the keyboard. He started typing extremely fast, opening up the preferences, changing a bunch of options, tweaking memory usage, server settings, etc. His hands never left the keyboard. Everything on my computer, Eclipse included, seemed so fluid, so fast and so responsive. For each specific action, he knew the exact procedure, the right shortcut. The dialogs would open up and close within seconds. Within a few minutes, he had identified the issue, fixed it, tested it and commited the fix. As he left, he mentioned:
You know, Eclipse is just another tool… They are only as sharp as you decide them to be.
I was blown away. Back with my keyboard and mouse, Eclipse seemed slow again, but I knew that if I took the time to master it, it would become a powerful tool. Whenever I swang by my teammate’s desk, I noticed he was only using Emacs and a linux terminal. He had mastered these two tools to perfection and was faster at producing efficient code using them than through other tools.
With the years, I have come to master a small number of tools. I know all the shortcuts in Photoshop, I am pretty fluent in Visual Studio, I have completely customized Eclipse, I have my own Sublime Text plugins and use hand-crafted extensions in Chrome. Just like learning to play an instrument, mastering any tool is hard and requires dedication and a lot of time. I have modified/treasured the tools in a way that they have become a part of me as a coder. With the years, I have come to the conclusion that one of the best ways to become a better coder is to learn to master the tools of the craft.
Even today, I read the debates about Eclipse vs Netbeans vs IntelliJ, about .Net vs Java, Rails vs Django vs Laravel, Mac vs PC, etc. Seeing a title such as the best \[insert any word here\] in the world is usually devoid of real information. To those who seek which tool is the best, just pick one that you feel good with, and go master it. Make it your own. Make it the best tool in the world.
Well said! I have been at honing my vim skills and though I still feel like a noob, I can definitely say now I do things lot faster compared to 6 months back.
zerr says (October 14, 2014 at 8:05 am):
Dude, you’re missing one main point – it is not about extensibility BUT usability. i.e. I don’t want to spend months for fine tuning IDE – it should be mostly great out of the box. C++: MSVC + Visual Assist. C#: MSVC [+Resharper], etc.. So no, I don’t want to spend time writing my plugins for sublime, emacs, etc…
Nicolas Bize says (October 14, 2014 at 8:12 am):
Well, most famous tools today are pretty much great out of the box I think. I’ve worked with IntelliJ, Eclipse and Netbeans and I find all 3 great, customizable tools. I took a lot of time making Eclipse my home but I think I could have done the same with any other editor. For C#, there are not that many options: MonoDevelop and Visual Studio + Reshaper. But still, you could use Visual Studio + Reshaper out of the box and still be 5 times less efficient than someone who has mastered the tool inside out. So it’s not so much about the tool than about what you make of it. You’re stating ST as an example. Aren’t you using any plugins? Have you ever opened the package explorer and installed custom things? Sure I’m efficient with an out-of-the-box Sublime. But I become a ninja with my own Sublime with all of its plugins, snippets, macros. 🙂 Thanks for reading!
zerr says (October 14, 2014 at 8:46 am):
I mentioned Sublime as an example of highly customizable editor, but you’re right. It is mostly a good editor with more or less good enough existing plugins.
zerr says (October 14, 2014 at 8:48 am):
EDIT: But SlickEdit seems much polished to me 😉
Paul Davis says (October 14, 2014 at 12:21 pm):
I work in Aero at BAE (Mostly Boeing Commercial) and I was showing a college some regex magic to do a complicated replace in Sublime Text 3 just yesterday and it blew her mind. I did not use anything but Cnt-H with an out of the box setup (some downloaded packages). I have not come across another editor I like that can do multiline regular expression block replacements. I use multiple editors depending on what I am doing but I find I reach for Sublime more and more. I have been doing development for 10 years and I am amazed at the power of Sublime to do “text” editing.
Nicolas Bize says (October 14, 2014 at 1:54 pm):
Such a great and simple example of taking things one step further with sublime!! Thanks 🙂
Which is great, and you will do this once every two years or you have some other really weird stuff going on with your code. I’m always amazed when people talk about how awesome an IDE based on some esoteric aspect. I have awesome command line tools that can easily do one off search and replaces in a code base. I recently started using PHPStorm for PHP development and I was amazed at the number of features it had related to things I do every day even simple things like highlighting unused variables.
Jake says (October 14, 2014 at 8:18 pm):
“Lots of options” is not a good thing on itself, if all the options suck. The 3 Java IDEs suck equally, when compared to Visual Studio.
Mikael says (October 14, 2014 at 9:41 am):
This is such a terrible view. The problem with “mastering the tool” is that the lifetime of the tool is unknown and translatability of the knowledge is equally uncertain. Becoming an expert of tools essentially means that you have invested excessive amounts of time learning this tool rather than learning some deeper knowledge (i.e. better software design principles). This is of course more a matter of shades of grey rather than black or white. For example, programming languages disappear as well but you have to use at least one. The difference is that a solid computer science education enables you to learn any programming language, and it should not take more than a month of full time programming until you are productive in a new language. Knowledge of emacs does however not translate to neither vim nor eclipse and vice versa. The same can be said of photoshop, paint and maya. Latex and Word are thoroughly different. Overinvesting time in learning these tools is a real personal risk. Yes, of course it makes perfect sense to become better at the tools we use to produce but to go from that statement to claiming we should just accept any tool and “master” it. The advice should be to reject any tool that requires you to master it in order to be productive.
Marten says (October 14, 2014 at 3:13 pm):
I so disagree. How can you be productive without hotkeys? Answer: you can’t. And learning like 20-30 hotkeys makes ALL the difference. And that; unfortunately takes time. The good news? You make all that time back once you master it. I knew this already, but I got it confirmed to myself when I picked up VIM, and used a few months to become fairly accomplished in it.
Marten says (October 14, 2014 at 3:15 pm):
PS: For Java Developers who need Eclipse’s refactor tools AND want Vim bindings, there is a nice plugin for eclipse called VRapper. It boosted my productivity by at least 25%
Mike S. says (October 14, 2014 at 6:23 pm):
“Becoming an expert of tools essentially means that you have invested excessive amounts of time learning this tool rather than learning some deeper knowledge (i.e. better software design principles).” In my experience, it takes a few hours a day for less than a week to become pretty fast with most tools. The productivity boost pays for itself within two months. So even if everything I learn about Vim/Eclipse/NetBeans/gEdit becomes useless within a year, it’s still worth my time.
Hasen el Judy says (October 14, 2014 at 7:36 pm):
@Mikael: you’re expressing a very limited view. You can’t be a great craftsman without mastering your tools. Good tools are extensible, and timeless. Vim is what now, 30 years old? People still use it, and still learn it! I learned vim about 5 years ago, and have been using it (very happily) as my main text editor ever since. If your tools change every 4 months, you’re doing something wrong. You might as well refuse to learn any programming language deeply because languages “keep changing” and “new languages keep popping up”.
Taylor says (October 14, 2014 at 2:41 pm): I will share your story with the world, my friend. This should be read in every introductory Programming / Computer Science course IMO. In hindsight, the level of technological bigotry that exists in the software realm is unbelievable. We should master what we like, and appreciate others expertise instead of criticizing their choices. Though, it already seems that the frenetic people that you are referring to have already jumped on the opportunity to tell you why you are wrong.
Alec Larson says (October 14, 2014 at 3:00 pm):
What a bullshit excuse for shitty software.
Nitin Dahyabhai says (October 14, 2014 at 3:26 pm):
If that were the case, simply reconfiguring it wouldn’t make a positive difference.
Hasen el Judy says (October 15, 2014 at 10:54 am):
@Alec: it’s actually quite the opposite: it’s about stopping to make excuses (e.g. “crappy software”) and learning to use what you have to the utmost.
It’s surprising to note that even large companies such as Airbus are thinking about cost reduction and favoring, open-source software, which can have potential vulnerabilities, which a malicious user can easily exploit.
michael says (October 14, 2014 at 5:46 pm):
Are you aware of the phrase, “security through obscurity” and why its not an effective form of security?
Monsto says (October 14, 2014 at 5:55 pm):
This is exactly right. On reddit, when someone re-asks the regular question “what’s the best text editor?” I invariably answer “the one that doesn’t get in your way”. If you can code like a demon on crack in notepad, then notepad is the best text editor for you. Conversely, if you assigned an editor, then you better make it work for you.I mean if you have no choice and you’re stuck rowing a boat in the rain, then you better figure out how to row that boat the best you can. Complaining about the rain doesn’t get the rowing done.
A_person says (October 14, 2014 at 6:06 pm):
I suppose, with enough effort, you can learn to make a VW bug drive like a Ferrari. It would probably be easier to start out with a Ferrari.
Hasen el Judy says (October 15, 2014 at 10:55 am):
Is the “Ferrari” actually easy to drive?
Jake says (October 14, 2014 at 8:23 pm):
Guess what, you can write an IDE from scratch, and even design a programming language from scratch, “to make it your own”. I guess no one has the means to do that, so a logical person will seek the best tool already available at the market. You don’t grow your own wheat, right? You don’t have your own power station, correct? Software tools are no different. Chose the already best, and further customize it to your needs. But guess what, there is a best, given certain needs and prerequisites. There are tools which are better than others for any given task.
I’ll adhere to the grey area described in some comments. I understand that most of us SHOULD be familiar with shortcuts and productivity “boosters” like macros and boilerplate generators. But most of the time, this repetitive work should let us know that we’re missing some key refactoring to lower our copy-paste activity. I worry about programmers that feel productivity is typing fast. Usually problems take 80% of thinking time and 20% of typing time. I’d rather follow Pareto’s rule on this one.
Thanks for taking the time and sharing this gem, Nicolas. You are quite right, there will never be a perfect OS/IDE/programming language, and it is down to each of us to make it as effective as possible.
Very well said. I totally agree, that instead of spending more time on which tool is better, I should spend more time improving my skills with the tool that I use. Thank you very much. 😀
Good article. I agree with the idea of focus on specific tools. It does not take too long to learn a set of keyboard shortcuts, and, I’ve got a ton of scripts I created a long, long time ago, which are still useful today. Sometimes it’s indeed irritating when a tool goes out of fashion or dies from lack of developer support, or perhaps due to the company selling it going bankrupt.
A.Smirnov says (April 22, 2016 at 5:02 am):
All I read is the coAll I read was comparison between hammering a nail with a Rock and a Hammer. While stating that you can achieve the same result with rock. Indeed you can, but regardless you will have higher failure state with it, then with hammer.
Patrick Günther says (January 4, 2017 at 1:33 pm):
So how does one teach eclipse not to validate the contents of node_modules folders. There are like 5 different places in the preferences where you can exclude these but eclipse still gets stuck parsing and validating the contents of node_modules.
Nicolas Bize says (January 4, 2017 at 6:08 pm):
@Patrick try to mark the folder as derived. (I think it’s PackageExplorer>Select Folder, ⌘+I to bring up properties, check Derived attribute)
ikk says (December 8, 2017 at 1:26 pm):
Why don’t you tell us what are those magic settings that make Eclipse good? Where is the setting for “Stop freezing ramdomly”? Where is the setting for “Stop giving errors when importing projects that I know for sure that Maven accepts”? Where is the setting for “Scroll wheel scrolls the pane under it”? Where is the setting for “Don’t show errors until you are damn sure they really exist”? I’m tired of trying to fix things that magically work after a clean rebuild or in a clean workspace.
Studies have shown that people value the products they own by how difficult they were to obtain. Things become more valuable when a sacrifice of money, time or energy was provided in exchange. This notion has given birth to hundreds of marketing techniques. This week for example we saw how the organized limited stocks in Apple’s new iPhones generated lines of thousands of fans accross the world. Even if you thought the phone was expensive, the mind somehow justifies the value and price when it sees how difficult it is for someone to actually purchase a brand new iPhone 6.
This marketing tool is used throughout many fields, including product packaging itself:
We’ve all been there… You buy a product and then spend minutes of frustration trying to open a package, using objects at hand such as nails, teeths or car keys, cutting yourselves on the plastic edge and bleeding to death while cursing out loud at the engineers and designers who came up with such a horrible packaging idea…
It turns out that because the package creates a frustration, the achievement of opening it provides a reverse satisfactory effect that continues throughout the initial usage of the product. This marketing technique is one that the French call the Oyster Effect, even though it only makes sense if you like oysters.
Well, I have now grown weary of such practices. In a world where the most valuable resource has become time, I feel like wasting time on opening a package or learning how to use a counter-intuitive product makes the product more expensive than its price tag states. In the equation, I feel like the Oyster Effect actually brings out more negative than positive.
Last week, I downloaded an app to sync up my electric car. After downloading it, I had to register the product before using it. I then had to go through an online 2-pages signup / confirmation process. I then had to set up the default settings. I then had to go through an initial tutorial. Finally I had to figure out how to sync up the car, entering lots of long alphabetic strings of random characters (think UUID) on a tiny keyboard. The whole process took me about one hour. All those steps were time-consuming. It was like trying to find the right scissors to cut through the package. Every step was enforced without any possibility to skip them, using a combination of ackward design and horrible usability before I could even have the app running. It only left me with a sour taste and a sense of frustration for the app itself. And yet I hadn’t even started using it.
One of the most challenging exercice is to ship software in a way that people can use it right away and feel right at home the second it starts.
While there are a lot of guidelines on how to achieve this, here are five that I like to follow whenever I ship a new feature or product:
Fast track product access.
Nobody wants to fill out some forms for something they aren’t sure they will use. Keep signups to a minimum. Prefer reusing accounts to storing new passwords.
Don’t do this:
Predictable and non-intrusive default options.
If you ship a programming IDE, make sure you ship it with spell checking OFF and with line numbers ON… Do not subcribe your users to anything unless they have desired to do so…
Don’t do this:
Make your software intuitive
Don’t attempt to revolutionize the standards by coming up with another icon for the Save button, or by remapping the shortcut keys that everyone is used to…
Don’t do this:
Aim for simplicity.
Limit the number of clicks required for each action. Keep the displayed information to a strict minimum.
Don’t do this:
Provide some flexibility
Provide options for various valid use cases.
The main reason why we create software is for our users to use them and enjoy them. The less is required of them to use the products correctly, the better the experience for both the creators and the users. As the French poet Antoine de Saint-Exupéry stated 75 years ago:
It seems that perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.
A big part of my previous job was to conduct technical interviews. That process was straightforward:
An interview conducted by HR determined if the candidate is a serial killer
An interview conducted by technical experts determined if the technical skills
An interview conducted by big boss determined how low the candidate was willing to get paid.
I interviewed two types of people: interns and FTEs. Interns only went through #2 while the others went through all three steps. In the span of 2+ years working at that company, I have performed more than 200 technical interviews. It was a learning and enriching process for me. The company was located in France, where it is near-impossible to fire people. Hiring the wrong person means paying a high price and being stuck for years. I have to say that while it was a tedious process, I loved every part of it.
Iteration One: the lottery quiz
I conducted my first tech interview in 2008. The company already had a working process that I had to follow. Interviews were one hour: 30 minutes to answer a 15-questions quiz, then 15 minutes to discuss their answers and the remaining 15 minutes to discuss the job responsibilities. That questionnaire was simply not great. It’s actually quite a challenge to come up with something worse. It contained five easy generic questions and then ten hard items that were specific to the frameworks we were using at the time.
It went from
1
- What is the difference between a class and an object?
to
1 2
- What is the purpose of the execAndwait interceptor in the Struts 2 framework?
Those were all random and I don’t think anyone in the company actually knew all the answers. A lot of them were specific to old versions of Java frameworks we were using. I definitely couldn’t explain or expand on most of those, and I was praying to not get asked to clarify the questions themselves! We needed something better. I went online and compiled hundreds of proper interview questions. At that time I believed in the quiz format, it just had to contain the right questions in order to reveal how good people were. The right quiz for the right people.
Iteration Two: Go Generic
I came up with the best 50 questions I could find online. I felt they were good questions because they could be answered in any language, and they were provided in a smooth crescendo of difficulty. I scattered the 50 and ended up with 5 sets of 10 questions that I would hand out randomly.
Sample question:
1
What is a singleton and when would you use it / not use it?
This was better, or so I thought… I would also usually get decent signal, and this went on for a few weeks, but it didn’t lead to stronger hires. While the questions tested familiarity with programming theories, they left me somewhat clueless with regards to the candidate’s ability to write code. I realized that those questions had two major flaws:
The questions were too generic. By not going into language specifics, I couldn’t talk about SQL, front-end specifics, etc.
The quiz was too short, way too short.
I needed a lot more questions, with things that were more specific to the responsibilities at stake…
Iteration Three: Quiz manager 3000
Okay, this is where things got a little out of hand… I went ahead and created an entire quiz application, crafted to embrace the company’s hiring process. I injected hundreds of questions. After the first interview, HR would select 3 topics related to the job description. The tool would then automatically create a multiple choice question quiz with 3 x 20 = 60 random but specific questions with a difficulty matching the person’s years of experience.
Sample question:
1 2 3 4 5 6 7 8
(javascript) var i = 0; function a(){ var i = 2; i++; } a(); alert(i); => 0 ? 2 ? 3 ?
One could see the candidate’s score updated live on the intranet app as the answers were selected. After completion, the tool would generate a report and email it to HR, with elements such as percentile, hiring risk assessment, etc. I was quite proud of myself. I had crafted the ultimate tool. It seemed perfect… until we tested it on our own developers…
Turns out that most of our engineers were getting the same score as people we had refused. I had spent so much time building the tool that I completely overlooked a huge flaw: my desire to fully automate the process had constrained me to only ask multiple-choice questions. As a result, the questions ended up being mostly trick questions… I wasn’t really testing software development skills! I had to swallow my pride, and admitted that the tool was counter-productive. It provided the wrong signals…
Iteration Four: let them code
I started researching how successful US software companies did their screening process. This led me to try out another method: just have them code. No more automation, we were simply going to write code. I would give out three algorithms. Candidates could pick the language of their choice and had access to a machine that was offline throughout the interview. The questions included classic problems found online, such as dealing with string operations (reverse words in a sentence), recurrence (calculate a term in fibonacci’s suite), and collections (order this list).
This was a pretty big step up. It became easy to see who was comfortable writing clean and correct code. It provided good signal on coding proficiency and provided means for good discussions and deep dives. I was initially happy with the results and we kept on going for a couple of months.
However I couldn’t shake off the feeling that I was still missing something. While it had become easier to spot those could solve algorithms, it didn’t always result in hires being great software engineers. Is the quality of an engineer only defined by how well they can solve a math problem, or how fast they can sort a list? There are so many more dimensions to being a great engineer…
Last iteration: a single question
I easily remember when I first started programming. QBasic was shipped with MSDOS 5.0 way before windows 3.1 came out. It contained its own self contained help screen with all of the functions and keywords of the language. To this day, I distinctively remember the feeling that grasped me every time I hit F5 and saw my programs execute before my eyes. A single printed line, a prompt for a name, some colors, a puzzle… I was in heaven. I remember putting line numbers before each command, filling my code with horrible GOTOs, learning with excitement and fascination something new everyday. I loved programming. I would spend hour after hour creating games, solving problems, showing stuff to my parents and friends. Years went by, I went from QBasic to Turbo Pascal to VisualBasic, wrote custom games for our BBS “Atomic BBS” that we ran from our home phone line through a 2400bps modem. I wasn’t a great programmer, in fact my code was pretty terrible… But oh man did I love it!! I just couldn’t let it go…
I’m assuming that some people feel that type of adrenaline rush the first time they sail a boat, go bungee-jumping or fly a plane… For me it was programming, compiling, executing. I gained that feeling 25 years ago, and it has never left me since. I was born for this. I’ve always been a programmer. I’ve always been convinced that those who are passionate about code can overcome any hurdle in software engineering. And so it was, that after a full year of trial and error, I completely stopped handing out technical tests. I simply sat down with the candidate and asked them:
“Will you please tell me about the best project that you’ve ever created?”
That simple, unique and non-judmental question was really powerful. While some provided vague answers to some obscure projects they had a hand in, others became suddenly alive and excited. They would talk passionately about the game they were creating, the website they had made, the open source projects they had contributed to, the utilities they made after being stuck in the middle of nowhere without any internet access. They were always proud to show me their work. I would ask them for technical details, complex technical challenges they had overcome, placing myself in their world rather than the opposite. As they talked at length, it was impossible to miss: I could see that light in their eyes, the same excitement that a child gets from compiling and running their first hello world. I would know right then that we had something in common. They were programmers too. Most of them didn’t know details about Struts, Apache Richfaces or other specific frameworks we were using. Yet, once they got the job, they always ended up being fantastic developpers. They learned faster, they produced better code, they inspired others with their creativity and positivism. They were coders at heart. In the end, that’s all that really matters.
Great article – I completely agree with your thoughts and will use this question in the future – if I am ever on the other side of the table.
Utkarsh Singh says (June 25, 2018 at 2:17 pm):
But its always good to assess their basic skills first, right? Try searching Interview Mocha for assessing candidates according to the job profile.
Pratap Singh says (June 26, 2018 at 8:38 am):
Just like Brian, even I am going to use your insights from now on but I also use Interview Mocha to assess basic candidates skills, so that I interview only the best candidates. Hope this helps others.
Ryan Fernandez says (October 30, 2019 at 4:31 pm):
I like interview mocha! It has a wide range of test subjects. On the other hand, I also use Kandio (https://kand.io) since it’s free and the assessment questions are quite challenging and filters out most of my candidates.
Phasma Felis says (July 26, 2014 at 8:40 pm):
We’re discussing this on Hacker News, and the big question seems to be: Are you only interested in personal/non-work projects, as your examples seem to imply? Or are you willing to accept any exceptional work that the applicant is proud of and excited about? There’s lots of really excellent programmers who don’t have a lot of time for exciting personal projects, but still get really excellent work done on the job. When I read your question, the first thing that popped to mind was a data-processing script I wrote in three twelve-hour days that saved many hundreds of person-hours in manual work. The data set came to us with a lot of errors that needed to be corrected from context; two of my coworkers, better general programmers than me, had said it was impossible without human judgment; but my particular perspective let me see the cracks in the problem and get in done in one long push. I’m proud of that, and excited about it, and I could happily talk your ear off about how I did it; but I did it for money, and after it was done I went home and played video games. How would you evaluate that response?
Nicolas Bize says (July 26, 2014 at 9:03 pm):
I’m in my car right now. I didn’t expect this thread to escalate, so I’ll answer in depth later. The question included all type of projects. It led to a lot more questions about specific details on the project architecture and design. It wasn’t perfect but if one could speak with passion about his experience as a programmer it was always an excellent sign.
Nicolas Bize says (July 26, 2014 at 9:47 pm):
Also the main advantage is that I was setting myself in the candidate’s ground. No surprises, nothing he wouldn’t be able to answer because it was his project, and by taking 30 minutes to go in depth into it, I could grasp a good sense of the person’s knowledge as well as his excitement for code.
Christian Walde says (July 26, 2014 at 9:18 pm):
I’d strongly recommend not asking “best”, but “proud of”. This is important because quite a few people have projects that are extremely important to them, do amazing things, use amazing techniques, but have shitty code you wouldn’t inflict on anyone else.
Jose says (July 26, 2014 at 9:28 pm):
Nicolas, this article is priceless and should be shared without moderation. I have been thinking about it for a long time also and recently read an article on Quora about having people talk about what they do but you nailed it.
rawat says (July 26, 2014 at 10:16 pm):
you wrote and expressed, what I have felt all alonf Brilliant.
You are absolutely correct. I have been programming since 1965. I was hooked at 16, and never lost the thrill. This month I’m learning Python. Did Picasso retire? Did Casals cease playing? You never stop programming. The best employees I ever hired all had taught themselves programming in high school.
Kevin says (July 26, 2014 at 11:39 pm):
I just left school two years ago in hope to find a company that appreciate exactly the things you describe. However I ended up somewhere where it is more important to talk about things and buy every IT-stuff you need. I guess I would feel much more comfortable in your company. Thank you for this inspiring post! PS: Recently I sat in a training and wanted to tell the other (mostly non IT) guys why I love what I do. I tried to describe my feelings when I make my git push to the release version, but they were not able to understand. “i guess some people feel that type of adrenaline the first time they fly a plane, sail a boat, smoke weed, eat at in n out…” is a nice metaphor for this.
I totally agree with you. I performed technical interviews for 3 years for a consulting company I was working for at the time. The interviews were done after hours on own time. I really can’t add anything to what you’ve already said. I can only say that are exactly right. That question alone will help you find the real enthusiastic programmers you want.
Nice article – thanks! FWIW, my approach is similar to yours, with just a few questions, but the intent is the same I think: to see if someone has a “fire in the belly”. Anyone who cares about their work is golden.
This is so true. The thing I consistently end up saying when talking about anyone I work work: “Attitude is everything.”
Philip says (July 27, 2014 at 3:22 am):
Damn, looking back, that’s what got me hired
Scott Smith says (July 27, 2014 at 4:16 am):
+1 That is my favorite question too. In addition to bringing out their enthusiasm, you find out quickly if they are motivated to do useful things. If the thing they are make proud of brought value is key.
auraham says (July 27, 2014 at 5:36 am):
great post and good night lecture but I don’t understand why did you say this: “now it is important for you to note that this occured in france, where you simply cannot fire people.” TML says (July 27, 2014 at 5:43 am): I personally prefer the Monopoly interview – from both sides of the table. Reg Braithwaite put it much better than I could, I encourage you to check out his article on it: http://raganwald.com/2006/06/my-favourite-interview-question.html
Nicolas Bize says (July 27, 2014 at 5:43 am):
@auraham: over there you don’t have the flexibility to fire someone who isn’t doing his job. More than anywhere in the world, the screening process in france has to minimize the risk of hiring the wrong people.
Nicolas Bize says (July 27, 2014 at 5:49 am):
@TML: I had read about it! That’s a great question IMO. The only downside I would see is that some good programmers might be blocked (brain fart) by the whole interview context even though they would be able to create great answers given a more relaxed context.
As an electronic engineer I’ve been part of the hiring process of quite a few technicians. What astonished me is that some of the technicians I interviewed had BSEE degrees, and had never worked in their field since graduating. In a couple of cases for 5-7 years! My go-to question was, “How have you used your knowledge of electronics for a fun project?” Blank stares. One person told me that he plays video games for fun. Two of the engineering graduates had never used their education after graduation, with their Senior project being the last thing they ever worked on. One of them worked in my company as a forklift driver, and told me he was never given the chance to move to Engineering (but we have in-company job openings all the time! This was the first time Engineering ever saw a resume from this guy – I checked!) One guy built a transistor radio several years back. My best hire was a woman who had built and programmed a robot based upon the Basic Stamp. She made the bump sensors out of push buttons and wire, she used a light sensor as an edge detector, and she modified off-the-shelf servos for the wheels. She did use a couple of off the shelf parts for robots, but that stuff was expensive, so she tried to find cheap alternatives. That little robot worked great. And she worked very well for us for several years before she moved out of state. I have had one objection to my preference that technicians (and engineers!) build something for fun – even on their own time. The objection is that specialized engineering tools, (like oscilloscopes) are expensive – so they don’t have the ability to try this sort of thing. Which is a bunch of BS.
It is only half of the perfect interview questions. The other half is for the interviewed, after taking half the time to answer your question, should then sit back and state: “Will you take the rest of the time to show me what you would do for me”. Unfortunately the young can be naive; the young who recognise that they can be paid for doing their hobby: doubly so. (But maybe less-so in the future after reading this answer).
Beautiful article, this really hit home! I’d let you technically interview me any day.
Lobo says (July 27, 2014 at 10:47 am):
I recognize a lot of the process you’ve been through! I’d like to quickly share my approach with you, as I believe it to be a mixture of some of your approaches and worked so well that it quickly became the standard where I as working. First I would ask some technical questions any engineer should know, like what is the ASCII table? This was only meant to weed out the candidates that really weren’t worthy and would only take 15 minutes. Next we would take half an hour ‘peer programming’ with some code the candidate brought along. In advance we sent an e-mail to the candidate asking to bring code that makes him or her proud. Then I would suggest a setting in which we pretended to be collegues and would peer program to improve or extend upon the code. With some candidates this would trigger passionate debates that lasted well beyond the half hour I’d set and with some we would just get into a defensive argument. During this process the level of knowledge, passion and coorporation of the candidate always became crystal clear. I’ve never mishired since using this process.
Having done a TON of interviews as well, the 2 most valuable discussions in all of them are.. “Tell me about your favorite project”. “Tell me about your least favorite project”. I ask that early, sometimes they become the whole interview, and that’s ok. If they are too fast with these, I’m likely not interested in continuing anyway.
Inderjeet says (July 27, 2014 at 3:29 pm):
While asking what is your favorite project is good, what if he don’t have one? Some people are good programmers despite the fact that, they don’t work out of office on programming projects. So, for sure, it is not a silver bullet to screen for good programmers. But what if these passionate programmers cannot show the same level passion in their official work. How many people crib about their professional work which don’t give a challenging work. So, looking for passionate programmers, for sure have negative effects as well. So, in my opinion ( I have about 10 years experience in interviewing) I agree no questionnaire is perfect – as you mentioned they have serious problems. But, we could ask him how he would solve a particular problem. We might ask him what was his challenging time being a programmer. Also, throw some design questions and see how he responds with out worrying about the answer. You may be able to find some traits of a good programmer from their responses. But the biggest drawback is we can’t test is his learn-ability. Most of the job gets done if he could learn new things on the job. This is something often neglected as well as most difficult thing to test. I think a guy with good attitude with a programmers mind and willing to learn new things has a good probability being a good hire.
A resume can give us a general idea of technical exposure if not some level of capability, but there is no quiz to measure passion. I made a hiring mistake early on by weighting a resume too heavily in my process. The candidate we hired was, on paper, excellent, but in reality we struggled with communication and productivity issues and I never was able to find a way to make the relationship work. The next hire, I almost did not look at the resume at all after it had been vetted for minimum qualifications. We were successful on take two and the contrast between the processes has left an enduring impact in how I will evaluate new hires in the future. Our second attempt was similar to your approach and worked out very well.
Joe Bro says (July 27, 2014 at 4:13 pm):
I hope that your shift key gets well soon.
Levon Shabagyan says (July 27, 2014 at 4:31 pm):
What a beauty! Wow. Simplicity and genius on so many levels. Can’t stop rewinding my 20 years in java development and realizing how different it would feel to create or work in teams created by this genius principle. IT IS the spark in the eyes that we had to look for! If I only hired those with the sparks in their eyes and never hired the brainy guys with no passion, the ones that end up as HR stats at big trendy billion dollar tech corps… Imagine a team of 5 or 10 devs fully built by this principle? This is how success is born. This is how you end up loving your work because you are surrounded by people who love it as much as you do. So many levels… Thank you Nicolas. P.S.: Now that “Bize theorem” is out in the open beware of fake sparks. Spark is a vector 🙂 Need to recognize the direction and length, filter out meaningless from real.
Thanks for the article, I agree that it is one of the more important questions. I ask that question too when interviewing. When I was a graduate student, I guided students through their final projects. I always used this to motivate them telling them that in interviews people will ask them about a project they are proud of or enjoyed and they better have something good to say.
An excellent article. I recall my first interview and the question asked was, “Tell me about your tech report”. I hire ACE’s – Attitude, Character, and Enthusiasm. What you know is taught, what you understand is learned. A personal “best” can bring out the passion in anyone – well … almost.
This is probably the oldest method to check any skill, if one is passionate enough on what he does, then almost all the time they would do better than those who does that just as work, but same time Its not easy to master any programming language in say 2 month or 3 month or even 6 month. It takes years of experience to build that expertise which is required by real world applications, and of-course you cannot afford someone trial and error coding your mission critical application. So, I like to go for an hybrid approach of all the things you mentioned. Remember, their is no silver bullet 🙂
I really like this. I like a similarly open-ended question: Can you teach me something?
Steve says (August 3, 2014 at 7:12 pm):
Great article. I’ve been working in IT for about 20 years, and I started using this approach a while ago. It doesn’t automatically get you the ‘star programmer’ (I think there’s all sorts of stuff that needs to line up for stars to shine), but it really does separate those that have “the spark” from those that don’t. Where I work, we still use a technical test to try and identify the skills that we need, because having enthusiasm without any experience is nearly as bad as having experience with no enthusiasm…
scott says (August 26, 2014 at 5:47 pm):
Tried this, didn’t work very well. Once that half hour was up and I got them to explain some code to me I had printed out and they would stumble. Think I will start with the code next time…
Nicolas Bize says (August 26, 2014 at 6:01 pm):
Hey Scott! What did you feel about the person once the half hour was up? Were you surprised to see them stumble with some code because after the first 30 minutes part you thought they were really good? Talking deep about a project should usually get you a very good idea of how someone handles code.
Nicholas Barns says (December 1, 2014 at 2:54 pm):
Hey Nicolas, first I want to say I’m really glad you mentioned your starting point (QBasic) because we have that in common. Ohhh those were the days… You know even today I remember that feeling when I wrote my first QBasic commands, it printed olympic rings and I felt so accomplished 😀 Also in that first try I also learned the meaning of “bug”, I used incorrect color order 😀 Anyway back to an article, some time ago we also used the approach that you mentioned in “Just let ’em code” section, but I found that a problem with this approach is that you are presenting a commonly known coding questions and candidates who invested even a few hours in interview preparation would find this or a similar questions on the web and would prepare them self for it. So the problem is that although it seems that a candidate demonstrated a good problem solving skills, or algorithmic thinking, or coding conventions… actually he just demonstrated his memorisation capabilities without us even realizing it, until it was too late. That is why we currently use various small and straightforward coding tests for a elimination process (for example something like the programming tests from TestDome), followed by an interview and last the pair programming is conducted. Now regarding the single question approach, I do like the idea and it does sound logical. I mean when a person is passionate about his work then he is not confined with just a work experience but with a personal experience as well. Also I need to point out that when I encounter a candidate that has contributed to an open source project I immediately put him as one of the favourites. But I can’t help myself to feel that something is missing here, to me this is not enough for the evaluation process… Also few of my acquaintances come to my mind that would just fail at something like this, even though they are a great developers they are just not passionate about it. They treat it as a work, nothing more and nothing less. Yes it is true that they do not inspire anyone, but then again they do not have to. I would really like to believe that every passionate programmer is great at it, but I’m afraid that is not true. I have a friend who just had a bad luck at his early job positions. He ended up learning a very poor coding conventions and terrible practices and this kind of knowledge at the early stage sticks with you for a very long time… Even though he loves programming the problem is that because he had a series of bad mentors they left a nasty scar in his knowledge. This also resulted in decreasing of his learning capabilities for new technologies, because his learning curve consisted of correcting the previous understanding and adding an enchantments to it…
Nicolas Bize says (December 1, 2014 at 7:32 pm):
Hey Nicholas, Thanks for your feedback! I did find the similar issue with the coding interview. Also, I’m sure some great developers don’t think we take them seriously when presented with problems like FizzBuzz. Regarding passion, it’s definetely not a 100% success method, otherwise noone would try to perform interviews otherwise. But I found it to be more successful than the other methods I had tried, even though I’m sure I missed on some great developers out there using it.
Ed Baker says (December 1, 2014 at 4:50 pm):
Your article makes me want to tell you all about my favorite project! Does it matter that I wrote it in 1975 on a time-sharing computer? My experience has shown that good programmers can learn whatever they need to perform well in a job. The point of the interview is to find a good programmer. I don’t care if he doesn’t know the language and tools that we use.
Nicolas Bize says (December 1, 2014 at 7:46 pm):
Haha tell me all about it, I love vintage computer stories 🙂
Steve G says (December 1, 2014 at 6:40 pm):
Many years ago, I was in a similar position at a small company, interviewing and hiring programmers for my team. What’s interesting is that I basically used the same format and asked the same question. An interview with me was spent going over their resume and then asking them to tell me about their projects, what their role and what their contribution had been. It was interesting to see people with “good” resumes flounder when asked what they’d actually done, and to watch others come to life – even over what might be considered “small” or “side” projects. So – Here’s a hearty +1 and confirmation from someone who came to the same conclusions you did.
RandyM says (December 1, 2014 at 9:22 pm):
Thanks for sharing great insights, Nicolas. I also like balancing it out with “tell me about a project you worked on but least enjoyed” to bring to surface some other traits the candidate may have.
My question is…if they’re passionate about their [hobby or job] project, does that equate to “you’ll be a good worker for me”? Like high productivity? Get along well with the team? 🙂
Asking someone about the past projects has always been a question for me. I have been asked that question quite some times. And I have also asked it to others. And making a person comfortable for the first 5 minutes is the key to successful interview.
Swathi says (July 20, 2016 at 2:26 pm):
I can sense the passion you have as a coder! Very nice article indeed…
Jack Gleeson says (November 28, 2016 at 2:36 pm):
Excellent article. We’re going through all the same pains you describe that come with the multiple choice & show us your code interview process. I’ve always thought we could do it better but wasn’t sure how. I think your golden question is what we’re missing
Jorge says (April 26, 2017 at 12:09 am):
That’s really nice that you create QM (quiz manager) by yourself. However you currently can find many services which create this kind of test professionally, like https://tests4geeks.com or codility. Foobar task is also awesome, especially when candidate already found a solution and you ask him to optimize it as much as possible. You could also ask about implementing some simple task, like you have a school. You need to implement the list of students, the list of subjects and the array of marks. So you can edit everything.
Interview, for the candidates its the first step to enter into there professional life its should be in perfect way, for the interviewer its also tough job to identified correct person for the job, thank you for sharing experiences.
Francisco says (May 5, 2016 at 2:40 pm):
Nick P says (May 5, 2016 at 3:10 pm):
Chris Rosenau says (May 5, 2016 at 3:13 pm):
Max says (May 5, 2016 at 3:14 pm):
Bradley says (May 5, 2016 at 3:32 pm):
Gaurub Pandey says (May 5, 2016 at 3:40 pm):
Kartik Agaram says (May 5, 2016 at 3:40 pm):
Derek Sharp says (May 5, 2016 at 3:50 pm):
Nicolas says (May 5, 2016 at 3:50 pm):
Jeremy says (May 5, 2016 at 4:06 pm):
Ben says (May 5, 2016 at 4:17 pm):
David Schaffer says (May 5, 2016 at 4:18 pm):
Jeremy says (May 5, 2016 at 4:21 pm):
Michelle F. says (May 5, 2016 at 4:35 pm):
Jamie Dalgetty says (May 5, 2016 at 4:58 pm):
Pierre says (May 5, 2016 at 4:58 pm):
Anjan says (May 5, 2016 at 5:01 pm):
Maxim Khailo says (May 5, 2016 at 5:02 pm):
QBasic Fan says (May 5, 2016 at 5:25 pm):
Mehdi Hasan says (May 5, 2016 at 5:37 pm):
Marcus Olsson says (May 5, 2016 at 5:41 pm):
Dusan says (May 5, 2016 at 5:45 pm):
Isaac says (May 5, 2016 at 6:00 pm):
winder says (May 5, 2016 at 6:11 pm):
DavidBechtel says (May 5, 2016 at 7:00 pm):
Benjamin says (May 5, 2016 at 7:11 pm):
S. Parker says (May 5, 2016 at 7:23 pm):
Stu says (May 5, 2016 at 7:36 pm):
Jay Vaughan says (May 5, 2016 at 8:01 pm):
anonymous coward says (May 5, 2016 at 8:43 pm):
Keith says (May 5, 2016 at 9:19 pm):
Brendon Rapp says (May 5, 2016 at 9:19 pm):
Leon says (May 5, 2016 at 9:41 pm):
Derek says (May 5, 2016 at 9:51 pm):
James Tayler says (May 5, 2016 at 10:10 pm):
Ken Arkfan says (May 5, 2016 at 10:23 pm):
Tim says (May 5, 2016 at 11:01 pm):
ignorantguy says (May 5, 2016 at 11:07 pm):
David Cornelson says (May 5, 2016 at 11:25 pm):
Nick says (May 6, 2016 at 1:27 am):
Pierre says (May 6, 2016 at 2:31 am):
redwall_hp says (May 6, 2016 at 5:54 am):
Peter says (May 6, 2016 at 6:30 am):
Raine says (May 6, 2016 at 8:00 am):
Greg says (May 6, 2016 at 8:52 am):
Overburn says (May 6, 2016 at 9:00 am):
Sawan says (May 6, 2016 at 9:44 am):
Patrice says (May 6, 2016 at 11:53 am):
Ah ah, I love your child first program! I think the first I wrote myself was doing basically the same thing!:)
amwales says (May 6, 2016 at 12:34 pm):
Dan says (May 6, 2016 at 2:39 pm):
OBloodyHell says (May 6, 2016 at 4:03 pm):
Jzna says (May 8, 2016 at 8:02 am):
Francis Kim says (May 9, 2016 at 12:31 am):
Yan Coutinho says (May 9, 2016 at 10:10 pm):
Miguel says (May 10, 2016 at 6:00 am):
Pablo says (May 10, 2016 at 7:31 am):
Rui Marques says (May 10, 2016 at 7:44 am):
LyndonL says (May 10, 2016 at 8:54 am):
Paul Clift says (May 10, 2016 at 9:15 am):
Jack C Shofner says (May 10, 2016 at 10:53 am):
Peter Monks says (May 10, 2016 at 11:35 am):
Jimmy Olano says (May 10, 2016 at 11:44 am):
Ted Weissgerber says (May 10, 2016 at 12:00 pm):
Tim says (May 10, 2016 at 12:09 pm):
C R Oberholster says (May 10, 2016 at 12:59 pm):
Alan says (May 10, 2016 at 1:02 pm):
normeus says (May 10, 2016 at 1:59 pm):
Chris Boss says (May 10, 2016 at 2:24 pm):
JH says (May 10, 2016 at 2:46 pm):
Rocky says (May 10, 2016 at 3:08 pm):
Cyrus says (May 10, 2016 at 3:32 pm):
Jorge says (May 10, 2016 at 6:33 pm):
Mike says (May 11, 2016 at 3:18 pm):
James Tayler says (May 11, 2016 at 8:09 pm):
Nikhil Rodrigues says (May 12, 2016 at 8:56 am):
Riccardo Tacconi says (May 14, 2016 at 8:02 am):
Joseph says (May 17, 2016 at 6:54 pm):
Pansophical says (May 18, 2016 at 4:04 pm):
André Willik Valenti says (May 30, 2016 at 3:23 pm):
Greg Mayer says (May 30, 2016 at 5:23 pm):
Gary P says (June 3, 2016 at 7:57 pm):
Stephane Gallès says (July 20, 2016 at 4:52 am):
BillyBob JoeBob says (July 29, 2016 at 12:50 am):
Big D says (August 9, 2016 at 12:03 pm):
Paul says (August 13, 2016 at 11:40 pm):
Tony C says (September 2, 2016 at 4:40 am):
Mike says (October 14, 2016 at 6:34 pm):
Erik says (February 17, 2017 at 8:49 am):
Jeff Bowman says (April 12, 2017 at 8:39 pm):
Juanjo says (July 2, 2017 at 2:54 pm):
Andrew says (August 2, 2017 at 4:37 pm):
Kris says (August 15, 2017 at 8:35 pm):
Katie says (September 4, 2017 at 2:34 pm):
Allen Jones says (December 15, 2017 at 5:36 pm):
Pierre Bonjour says (December 20, 2017 at 1:03 pm):
George says (January 6, 2018 at 4:00 pm):
Pierre Bonjour says (January 16, 2018 at 1:05 pm):
SamW says (May 27, 2018 at 1:19 am):
Chris S says (May 27, 2018 at 2:25 am):
David Cornelson says (May 27, 2018 at 4:41 am):
Sake says (May 27, 2018 at 6:20 am):
Anjan Bacchu says (May 27, 2018 at 6:21 am):
Chris says (May 27, 2018 at 6:56 am):
Mauro Meloni says (May 27, 2018 at 10:21 pm):
Mark says (May 28, 2018 at 8:01 pm):
Alessandro Nazzani says (May 29, 2018 at 10:15 am):
Darin says (May 29, 2018 at 1:16 pm):
JQB45 says (May 29, 2018 at 4:31 pm):
Doug McFarlane says (June 1, 2018 at 5:16 pm):
Alexa Tilbrook says (June 4, 2018 at 6:29 am):
Comments are now closed