An Essay for Programming Students

mikeblas

[H]ard|DCer of the Month - May 2006
Joined
Jun 26, 2004
Messages
12,777
About Learning Programming

There are often questions in this about what language someone should learn, or how someone should approach studying programming. Every once in a while, someone will even ask about how to approach Computer Science, specifically.

I've been thinking about these questions a little. The issue has been attractive to me for two different reasons, I think. First, there's a shortage of good engineers. Really: engineering graduations are on a decline, and they weren't that high to begin with. This puts industry in a bind, because industry and commerce need software. But they can't get that software without engineers. I'd like to see this situation get better because better, easily obtainable technology means a better future for everyone.

Next, I occasionally talk at career days at schools. (I do this far less often than I wish to, in fact.) I always think about what I can tell young students who might consider an engineering career, or work in the field of mathematics or computer science specifically.

I thought I would write an essay and post it here to share my thoughts. If you'd rather read something else, feel free; you shouldn't have a hard time finding something interesting on the Internet, perhaps without even leaving HardForum. I'm just hoping to help those I see so frequently here, asking for guidance.

The Big Disclaimer

Before I start, however, there's a couple things you might want to know about me. Most importantly, I'm a college dropout and I have a strong disdain for the educational system in America. If students are paying $0.30 each for ScanTron test forms, but the football team flies to Denver for free, well, you've got problems. And the US education system, at all levels, has some serious problems.

Next, I've always known what I wanted to do with my life. I think this puts me in the minority; most of my acquaintances in high school didn't have an clue what they wanted to do while they were graduating. They found a major very late, by my standards, and had little background in the field of their life's work before they started studying it. My decision was easy, and I believe that not everyone has it so easy.

Finally, by no means is this essay intended to be anything like an answer, or give prescriptive advice. Personal situations are too varied, resources aren't ubiquitously available, aptitude and desire are different, and so on. One of the subtle reasons that I'm writing this post is that one of my previous notes was called "my advice" and "my recommendation" when I had gone out of my way to explain that it really wasn't -- it's just what I did myself.

What I Did Myself

The way I learned to design and write software might not work for everyone. I've listed some of the reasons it might not work above, but by far the most important reason is that everyone is most comfortable, and therefore most effective, doing their learning in a different way. (This is one of the biggest reasons I've got a problem with formal education systems: they expect a largely one-size-fits-all approach will work. It might be the best we can do right now, but such a system doesn't work so well. At best, it substantially doesn't suit a number of individuals.)

Experience shows us that people learn best in different ways. Look at your friends: I'm sure you know someone who studies by sitting in front of the television with a book open, cramming at the last minute. And someone else who sits in a quiet and dark room with a bright desk lamp, exactly four sharp pencils, one highlighter, two new pads, and their textbook.

Book recommendations always bring a variety of answers. Why? Because people need different authors to approach material in different ways. I sweated bullets when writing my book about getting the style and scoping right. Even after all those revisions, I'm still not sure it's right. Readers would send me emails saying that they loved my book. Others would write and say it sucked, and that I should write more like so-and-so, instead. As an experiment once, I forwarded such an email to someone who had liked my book; I asked them if they liked that other guy's book, and why. They quickly responded that all the reasons the other reader hated my book and loved the other one were reasons they didn't like so-and-so's book, but loved mine.

The educational process, to my naive and untrained opinion, seems very much hit-or-miss. There must be fundamental things that always work, but teaching adults (or near-adults) complex things doesn't seem to be affected by those fundamental techniques. Otherwise, everyone would get it right and all schools would be equal, wouldn't they?

I learned programming by first studying digital electronics. I used a breadboard and TTL logic chips along with a training manual from Hewlett Packard. Eventually, I found the BugBook series which really got me going. It included little modules: a bank of switches, four LEDs with transistors to drive them, a seven-segment display driven by 7447 decoder, and so on. It was powered by a six-volt lantern battery and a drop-down diode, and later by a 7805-based power supply that my neighbor built.

I was eight before I got my first computer, a single-board machine with a 6502 processor and one kilobyte of memory. It had a great six digit, seven-segment display, that I learned to program. Best of all, it had about 40 lines of digital I/O pins which I could use to control my little digital circuits. There were four timers, if I remember right, though a couple were used by the system itself.

This computer was programmed in machine language; it didn't even have an assembler. I used it for weeks, studying the sample programs and reading programs in magazines. One day, a few paragraphs in a programming book put it all together for me. Maybe the book was by Randal Hyde, or Gary Gygax; I can't remember. But the explanation was very clear and it made me understand what the magical board was really doing in a way that related to all the digital electronics I had been studying.

And that was it. I was off reading everything I could find to teach myself. I moved to a more capable little computer, then up to an Apple II. I was doing digital electronics projects at a furious pace, buying all the hardware I could afford and making little doodads which invariably ended up interfaced in one way or another to whatever computer I had at my disposal. By this time, I was eleven or twelve or so.

By the time I was sixteen, I had mastered the 8086, Z-80, and 6502 assemblers I was using. I had learned Pascal and C, and written countless little projects. Looking back at it, I really didn't learn a lot--I lacked any guidance whatsoever from someone who could have mentored me to learn more or study interesting things that were "just challenging enough". Anything too frustrating would've quashed my interest. Too easy? I would've similarly moved on to something that was more engaging.

When I tried college, I found that the people I was paying to be my mentors weren't really doing such a hot job, either.

What I Learned

If you had asked me what I had learned at that young age, I would've rattled off a list of languages and maybe a few techniques, not unlike the one above. It's taken another decade or two to realize what I truly had learned, not just what I thought I knew.

My perception of computers starts out at the lowest levels. I'm not necessarily comfortable with something unless I am satisfied that I understand how it works. A truly great racing driver isn't going to get very far, no matter how talented he is, unless he understand the car at least a little. He doesn't need to know how to fabricate his own suspension, or do a valve job on an engine. But he should certainly know what's invovled, and what he components do. Otherwise, how can he understand how his inputs to the car will affect the car in different situations? By experience? Sure -- given an very large number of laps, he can probably engage in almost every scenario. But that's not realistic, and it won't be complete. His gut instincts might be wrong if they're not rooted in an education about what the car and its implementation.

If you frequent the storage section of the forum, you might remember my badgering questions about RAID. How did it really work? How could I ever be comfortable writing software for it if I didn't have the foggiest idea of what made it really work? Why is some code slow and some code fast? If I don't understand the processor and the architecture surrounding it, I'll have a hard time optimizing for that same architecture, won't I?

Succinctly, what I learned was that a bottom-up approach rewarded me. I could learn something, then make it intuitive. Then, build on it. Even years after learning a lesson, I might still recall the facts about it and apply them to a new problem.

Do I know everything at the lowest level? Of course not. But what I do know makes it easier to learn more as I go along.

Since everyone is different, I'm sure there are people who'd rather drill-down. (And, maybe, in some situations, I'm one of them. I'd rather cook a burger and eat than learn enough biochemistry to understand why adding peppers or mushrooms makes it taste so much better.) And people in-between, who'd rather study and get a grade and get out of there. Maybe some of my observations, presented in the balance of this essay, will be of interest to those types of learners.

If you’re in one of those other categories, maybe you can still learn from the ground up by reading books like “Write Great Code: Understanding the Machine”, or “Code”.

Debugging

I've become convinced that one of the most important skills in professional software development is debugging. The series of articles I wrote for the now defunct Visual C++ User's Journal underscores that belief, I think.

When interviewing candidates, I try to ask them at least one debugging question to gauge their ability to think through a problem. It is too easy to bone up on trick questions or memorize a few algorithms. What you do when things go wrong, in whatever discipline you're practicing, shows your true mettle. Do you ask for help? When? Can you at least measure a few things and look for clues? What if you find good clues? Bad ones? Conflicting ones? What if the terrain doesn't match the map?

A great candidate will admit to me that they debug code that already works. To the inexperienced, they'll sound like someone who doesn't know that you shouldn't try to fix something that ain't broke. But how can you fix something that is broken if you don't know what it looks like when it is working?

If you're working on a very low-level computer system, your debugging options aren't always wonderful. You might have tools with some rough edges, or some very critical timing issues. You'll need to debug more with your brain than your keyboard. A good understanding of the way things work is going to be indispensable in those conditions. Your noodle will be your biggest weapon.

I think that debugging extends past stepping through code, particularly when considering the study of code that already works. It means watching that code and seeing what it does. Why might it hit the disk so much? Does it cause page faults? Where? Can they be avoided? Debugging also involves doing code reviews, thinking of symptoms and causes, and reassuring customers.

About Langauges

One of the more common questions here is about which language to learn; even which implementation of which language.

If I interviewed someone who told me they knew language Z, but didn't know language R too well, I wouldn't mind. We could have the interview in language Z. But I'd press them a little bit about what they thought of language R. They should know at least a little about it; what it is good for, what it's not good for, and so on. If they start ranting about how it was invented by an evil scientist who worked at a company that everyone hates, or that it "just sucks", or other such nonsense, I can't imagine the interview would last very long.

A professional developer isn't concerned with language; they're even less concerned with style in a particular language. They're able to pick up a language pretty rapidly, since it's just a different way to express the ideas they should already be very familiar with. As they gain practice, they'll get better and more fluent. But if they spend the first couple of weeks learning different things, that's no big deal.

Your first language, however, is a more interesting question. I stumbled into machine language simply because nothing else was reasonably available at the time. Young programmers these days don't have it so easy.

If I were starting, I'd think about a few attributes for the language I chose to learn. First, would it be something that's commercially acceptable? I don't mean the language that offers the most jobs in the paper; I mean something that has community support, that I can get help with and find books for, and so on. I don't see any reason to start programming with Haskell, or some other lab-rat of a language. C++, Java, Perl, Python, some assembler, whatever; they all are documented and viable.

Next, I'd consider the frustration factor. How much background do I need to learn about the tools in order to get started? Having a mentor at your disposal, or access to some books or courses, can significantly change the way you answer this question. If your buddy can help you download and setup the Ming kit or Visual C++, maybe you should do that. On the other hand, if you're doing it yourself and don't have much background, I can't imagine something more frustrating then looking through a list of gigabytes of zipped, tarred, archives. How would you even know you got it to work?

One of the langauges I think that's doing really well in this area turns out to be Perl. It's interpreted, so you don't have to sit through long, multi-step compiles. You can get immediate results without going through the edit-compile-test loop. Setting up the language isn't hard at all, and there are packaged installers that do the hard work. There's no shortage of books or websites. In fact, there's a book or two that teach algorithms with Perl, so you can study performance and tuning with the language, too.

Python is in the same boat, but it seems support for it is just a little less mature than for Perl. There might be other languages in this camp, but those are the ones I know. If you don't have the gumption to start out with assembler, then perhaps one of them is right for you.

Be wary of people who say that something's "too ugly", or "really stupid". Maybe they're right, but that doesn't concern you right now. Learning does. Make a note of what they said and gain some experience -- then, see if you can figure out why they held that opinion. If you have a little experience under your belt, you might try asking them about their opinion. See how many statements they make which are unsubstantiatable, and how many seem believable to you. (There's no shortage of religious wars about platforms, tools, and languages in this business. Since we don't certify engineers, there's no shortage of true experts.) Did listening to their beliefs teach you anything you felt like you could take away as fact?

Making Progress

Computer programming isn't easy. Many smart people can't do it, or aren't interested in trying. Some smart people learn enough to do what they need. Maybe they're using Fortran, or the Mathematica language.

Programming professionally -- making software that the general public uses, in whatever form -- is actually very hard.

As hard as it might or might not be, not doing it guarantees failure. And not continuing guarantees decay.

I learn Perl about twice a year. I just don't use it enough to remember what I've learned. I've got no problem starting again, and I remember more each time. But I still can't call myself well-versed in the language because I'm always rusty, and because I haven't solved any really big problems using the language.

Imperative to a successful start, then, is a project that's just the right size. Maybe your mentor can help you pick one depending on your abilities and the time and tools you have. Maybe it ranges from finding some small prime numbers to re-writing the Windows CALC program. It's going to be simple, though; if it isn't, you'll get hopelessly lost and frustrated. Your first project is certainly not writing a CAD program, or a chess game, or a MMPORPG, or anything that's going to set the industry on fire. So set your expectations realistically. You're not going to buy some paints at the art store and churn out The Mona Lisa on your second weekend.

What is important for your first project is that it interests you. If you like model rockets, make a program that estimates fuel capacity or predicts where a rocket will land given some parameters about its launch. If you like music, pick something simple: print out all the tags in your MP3 files and sort them, then print them out as text. Think of things that you'd never do by hand, but could do with a computer. Rip through every file on your hard drive, for example, and count them -- compute the average length, find the oldest and newest file, and so on.

If you start getting good, buy a book like "Programming Challenges" and work through it. Or try some of the exercises in an algorithms textbook. Heck, just implement the algorithms the book describes and time them with different data sets.

Don't bother jumping into Microsoft Windows, or the MacOS presentation manager, or X Windows at first. There's plenty of time for that later, and it'll all be easy to understand after you've got some notches on your belt.
 
Becoming Employable

I'd like to see younger developers consider their learning separately than their employment. I know this can't be done completely, since someone coming out of school immediately has to start paying their loans and bar tabs, and for the plaster work in their last campus apartment. But that's something I'd worry about as a junior or a senior, not as a freshman or a high-school student.

What if you started your CS degree in 1999? Maybe you thought the world was C++; you wouldn't be far from the truth. But then C# happened while you were in school, and now it's all the rage.

Are you unemployable? Hardly! A good company will hire you on your ability to learn and think, to solve problems and work well with other people. You're new, you're green; they know that, and should place you accordingly within the company without a problem. If you can convince them you really do know how to solve problems with C++, or Java, or whatever your favorite language was, you'll do fine.

Engineering

There’s a lot of attention to supportability, security, and reliability in the computer industry. What makes writing software for the general public so hard is making sure your software meets those three criteria in a meaningful way even when it is in the field being abused.

Lots has been written about those subjects as they pertain to computer science, but I wish every developer would read the first chapter of “Engineer to Win: The Essential Guide to Racing Car Materials Technology or How to Build Winners Which Don't Break”.

The late Carroll Smith wrote that book. He was an acclaimed automotive engineer and a car racer. He was an SAE member and worked as a consultant for Scuderia Ferrari.

The essay is very emotional. It explains what happens when a part in a race car fails. When a bit of software fails, we have a much more cavalier attitude to it. Maybe that’s what makes so many of the people involved in the software field unfit to be true engineers; they have no concern with dire consequence. Nobody will go into a wall because a bolt was stressed beyond its limit; nobody will scrape along the ground at 130 miles per hour because someone forgot to account for the torsional stress in the chassis.

Despite the shortage in the industry, if someone wants to become a programmer and not a software engineer (or systems engineer, or electrical engineer, or so on), I think the industry can do without them. Despite how the media and popular culture have portrayed software developers, there’s no room for half-baked foolishness.

You should be prepared to engineer to win.

Summary

I hope this essay has given you, at the very least, something to reflect upon in your career path and the choices you might make. If you have specific questions or need advice, please write or post and I'll see if I can help you.

More notes about Becoming Employable

When I interview candidates, particularly during the phone screen, I try to get a feel for where their talents lie. Some guys are great web developers, but can't code C. Some guys write great C++ code but are terrified of the web. A precious few are great at both.

One way I like to ask people about their talents is to have them rate themselves on a scale of one to ten. Before I let them answer, I explain my scale further by pointing out a rating of one in a skill would mean they're down at the bookstore, trying to figure out which book to buy on the subject. And a rating of ten might mean that the guy has written professional, world-class tools involving that technology, or worked with or on the standards organization governing or influencing that technology, made influential contributions to that technology, or what have you.

At my current job, we like generalists. Ideally, I want to hire a guy who's a five or a six, on that scale, in a bunch of technologies. And a nine or a ten in at least one technology that's relevant to our business.

I'll use myself as an example. I know C++ really well, and have worked on development tools for the language, worked directly with guys who have worked on the standards committee, and am very familiar with the language. Maybe I'm not even a ten myself, but a nine is certainly a fair rating. I know the pitfalls of the language, I know what it looks like when things go wrong before they go wrong. When the language is misapplied, I know how far it can bend before it breaks. I've used many different implementations of the language, and I know their trade offs. I've implemented subsets of the language myself, and understand why many of the design decisions were made in its creation. I understand the surrounding tools--debuggers, the pre-processor, various libraries, lint, and so on--at the same level.

The deeper level of skill is exceptionally valuable because the world isn't perfect. When things go wrong, they don't always get fixed. People and projects keep on plugging until they're done, and there's time to fix them. There might never be time to fix them, if the project is large enough. I've worked on single projects that have involved more than 30 million lines of code--certainly, a "small change" that's wide spread and global in effect is almost impossible in such an environment without a very deep understanding of all the possible ramifications of the issues, and a prediction of how the change might turn out.

I know SQL at the same level, and a few dialects of assembler at similar level. Other languages, like PHP or Python or Perl, I don't know that well. Five, six, maybe seven out of ten for those.

Someone doesn't become an eight or a nine or a ten by taking a class, or reading a book, or doing a couple of fun projects at home. That level of skill only comes from years of experience, deep insight, and study. This is not what I expect of someone who just tells me they "know" or "have used" a language. I've happily hired people who don't have this level of knowledge.

The idea of knowing how to write software, however, is important and should be present in any programmer, regardless of their language. This is what we (and, I think, most healthy companies) actually cover in interviews, independent of specific syntactical skills in some tool set.

A developer who has this knowledge can move from their favorite language, where they're a seven or an eight or a nine, and jump into a language where they're a one. They might not even start at one, since their insight helps them know how things must work, and verify those presumptions very fluidly and quickly. Before the end of one day, they're a four or a five. They might not know where the rough spots are, they might not understand the finer points or be up-to-date on the latest techniques. But they can write software that isn't dangerous or damaging to the stability of the project in just a couple of weeks of practice with the new tools.

I think that any aspiring software developer should be on a path to try to find their niche -- the language and tools where they can get themselves to an eight or a nine or a ten -- an then start branching out to other tools and broader knowledge.

If you're not in that top range in any area, it's fine--you can still be hired. You should try to surround yourself with a nine or a ten, though, if you can. You'll learn more. A good company will still be interested in employing you because you can contribute meaningfully, as long as you're at least a five or a six and learning.

References

“Code: The Hidden Language of Computer Hardware and Software”, by Charles Petzold. This book explains code—why people use symbols or numbers to represent things. And, in turn, why computers must do the same to be efficient. If I taught a 100-level computer course, it would be required reading. ISBN 0735611319.

“Write Great Code”, by Randal Hyde. This is a series. Much like “Code”, it explains why computers work the way they do, so that you can get a running start at higher levels. ISBN 1-59327-003-8.

“Assembly Language Programming: 6502” by Lance Leventhal. I think this is the book that made it all come together for me. But maybe I’m wrong. ISBN 0079310273.

“The Bugbook I, II, IIA: Logic & memory experiments using TTL integrated circuits”, by Peter Rony, et al. This is a combined binding of the first three books in the series of digital electronics books that contain simple experiments using simple logic, clocked logic, and even some memory circuits. Published in 1975 by E&I Instruments.

“Programming Challenges”, by Steven S. Skiena, Miguel Revilla. These are programming contest puzzles from the ACM. There’s no solutions, and the problems range from simple to really hard. ISBN 0387001638.

“Programming Pearls”, by Jon Bentley. This includes some simple algorithms, as well as a seminal analysis of the software engineering and programming professions. If I was a professor, this would be required reading at the CS300 level. ISBN 0201657880.

“Engineer to Win: The Essential Guide to Racing Car Materials Technology or How to Build Winners Which Don't Break”, by Carroll Smith. This book is about engineering racing cars, but has a great essay about engineering in general. ISBN 0879381868.

EMediaWire has an article about computer science graduation rates. They're not hard to find elsewhere; I've read about the issue in the last year in the ACM's Computer magazine, for example.

Disclaimer

This post is made without warranty and confers no rights.
 
Last edited by a moderator:
As an Amazon Associate, HardForum may earn from qualifying purchases.
Great post(s) mike.

My perception of computers starts out at the lowest levels. I'm not necessarily comfortable with something unless I am satisfied that I understand how it works.

I agree that as a professional in any field, one would need a solid understanding of the job. One thing that differentiates the average from the elite is that the average engineer will figure out how to solve a problem. The elite will take it one step further and understand *why* you solve the problem certain way(s).

I've become convinced that one of the most important skills in professional software development is debugging.

Also a great point. The education system allows for such a process. The problem though is that a majority of the students (in my experience) lack the initiative and dedication to sit through the debugging process. Most want everything handed to them on a silver platter and would rather take the quick way out.

I can't count the number of times had to listen to the rants of an ignorant engineering student about how the teacher never gives them the answer when they obviously do not put in the hours to work through the problem and give it an honest attempt.

I'd like to see younger developers consider their learning separately than their employment.

Exactly! If you do what you love and strive to be the very best that you can be at it. You will survive in the industry.

When people ask me if I'm worried about the future of the availability of employment in the industry, I always respond with a big fat N-O. I'm confident that there will always be a demand for tech development in my lifetime.

--KK
 
KingKaeru said:
The elite will take it one step further and understand *why* you solve the problem certain way(s).
Or, at least, why you excluded other possible solutions. And write that down, so that people who come after you and think one of those other solutions was great understand why you did what you did. Otherwise, over time, the project will drift from the original solution to a different one which someone thought was better, back to the original one when that guy figures out (the hard way!) why you chose the one you did.

Thank you for your kind feedback.
 
Excellent essay... I'm sorry to drag a relatively older thread up, but wow... this just hits on so many good points :). Thank you for taking the time to write this!
 
Yeah definitely an excellent 'guide' for us 'lost' ones. My problem is that I seem to get bored with languages before mastering one I jump to the other. One of the ways I learn though, is taking a program's code that is a bit beyond my level and changing values around to see the output/difference. This seems to work for me.
 
I just got to this essay through a link from anothr thread, and I don't know how I missed it. Absolutely wonderful advice Mike. I'm gonna email this to my CS friends.
 
Wow, thanks for this.. very interesting.. I don't really know programming yet.. but I've been tring.. just been hard to stay interested when you follow the examples out of a book. I need to find something small that I can do, and program something.

They should sticky this :)
 
Wonderful essay. i think it hits alot of points on the head. I started college in 99 and actually went through the C++ to java transition. At the time i was a like "Oh Shit" because i had just spent the past year and half learning C++. In reality I think that was the best thing for me. That summer I worked in a job that required Matlab programming and Visual Basic. Next summer php. What all of this taught me was that to be a versatile programmer what I needed to be able to do was learn how to analyze and solve problems and then apply technology to it. I think this point is missing in alot of CS degree programs. I think the approach that one should take is alot like a mechanic or woodworker. Computers, languages, and whatever else you use for development are synonymous with tools. As time goes on the tools change, sometimes for the better sometimes for the worse. If you want to be employable you need to be able to roll with these changes and take them in stride. This requires that you learn how to learn, which is another point I think is largely missing from the educational system in America. One other point I think many people struggle with is research. I also tend to blame this on the education system as the typical approach is to give students one book or maybe a set depending on the class, with the implication that all of the answers you need for the class are in that book. This is rarely the case in the real world, and I find alot of students aren't prepared to face this.
 
It really has become clear to me that flexibility is the key. That was a good essay, and even motivational. I need to start doing some of my own little projects on the side. School is drudgery sometimes.
 
Perhaps what you're calling "flexibility" is the difference between a programmer and an engineer.
 
mikeblas said:
Perhaps what you're calling "flexibility" is the difference between a programmer and an engineer.
Heh, you just hit the nail on the head I think. Never really looked at it like that.
 
Maybe the essay is too subtle, then. The point is that people who are asking what programming language they should learn (first, or next) are usually just programmers (or, say, IT workers). An engineer (or, say, a CS student) is going to realize that it's the problem solving issue that's important; that the language is just an expression of a solution, and that a deep understanding is important.

There's nothing wrong with being a mechanic. But some people are going to be much happier designing engines.
 
The essay was very clear actually. I guess the thing that struck me was applying that to myself.

It just kind of struck me personally because I guess my experience, education thus far, and aspirations are more towards engineering than I had considered.

Regardless, thanks for the insight and the good reading.
 
mikeblas said:
An engineer (or, say, a CS student) is going to realize that it's the problem solving issue that's important; that the language is just an expression of a solution, and that a deep understanding is important.


This point seems to be lost on many CS students as well. I'm in a unique position at my university where I'm doing a full-blown EE degree, and taking a CS certificate on top of it.

Side note: The CS certificate involves all of the computer science and math requirements for a 4-year CS degree, but does not involve taking all of the humanities electives. It still has the ``power'' of a 4-year degree, just under a different name (and it only adds 1 year to the EE degree).

In this position, where I was thrown head-first into engineering but at the same time got to work alongside computer science students, I tend to find that many, many computer science students completely miss the problem-solving point. So many of them become completely focused on learning a specific language (Java is the typical language here) that they don't learn the problem solving skills needed.

The result of that is when they are presented with a new problem in a different language (for example, low-level programming in C), they completely freak out. ``This isn't fair, we don't even know this language! We can't do these assignments!''

I don't know the solution to this problem, but I think it lies in forcing students to actually think about what they're trying to do instead of just banging away on Java code until it works. From what I understand, the 1st and 2nd year curriculums at my university are being seriously revamped to address this issue. For example, all 1st year programming assignments will require pseudo-code with explanations to be handed in a week or two *before* the implementation is due.

It feels like this is starting to get a bit long... In summary, if you want to be a good developer, you absolutely have to think much further than ``how can I program this?'' Don't worry about the language, once you begin to think of problems as little steps you have to solve, the implementation will typically just flow from your reasoning of the problem.
 
fat-tony said:
I don't know the solution to this problem, but I think it lies in forcing students to actually think about what they're trying to do instead of just banging away on Java code ... For example, all 1st year programming assignments will require pseudo-code with explanations to be handed in a week or two *before* the implementation is due.

The things I have learned about programming languages I have learned from banging away until I got it to work. The assignments for my schools introductory programming classes focus on giving you the ideas of how to program the task and then giving you a complex problem that must be solved in several steps each one requiring you to use what you learned about the code to solve it creatively. However the what has taught me about solving the 15-20 short problems that we received in section each week.

Now in my advanced classes I find myself using ideas that I learned from those simple problems to solve small problems all the time. It would have been easy to never do any of those simple section problems since we only covered about 1/5 of them in class each week but having worked out each of them coupled with doing the assignment has worked very well and after my first programming course I learned that the important thing was using programming to solve problems and learning about what tools are available during the process, not just learning programming code. Because 60% of the score was based upon exams and 40% on assignments, those who didn't study all the non-required questions would have a very tough time doing well on the exams even if they got 100% on all the assignments.

Pseudocode explanations weren't required in that class but because of doing those simple problems, now when pseudocode explanations are required it is a lot easier to think of what needs to be accomplished and write it out without having to write a program and compile it which seems like a valuable skill.
 
mikeblas said:
I was eight before I got my first computer, a single-board machine with a 6502 processor and one kilobyte of memory. It had a great six digit, seven-segment display, that I learned to program. Best of all, it had about 40 lines of digital I/O pins which I could use to control my little digital circuits. There were four timers, if I remember right, though a couple were used by the system itself.

Man, that brings back memories - my very first job was programming those dinosaurs, AIM65's, came with 1K or 4K or RAM and you had a 4K EPROM for burning in your program. 6502 assembly, what a joke that was!
 
pigster said:
Man, that brings back memories - my very first job was programming those dinosaurs, AIM65's, came with 1K or 4K or RAM and you had a 4K EPROM for burning in your program. 6502 assembly, what a joke that was!
As an architecture? Perhaps--but the commercial success of the platform is sure hard to question.

I had a SYM-1 first, then an AIM-65 later. I sold it on eBay a couple of summers ago after discovering it in a box in the garage. My AIM was mad pimped; I had both the BASIC and the assembler ROMs.
 
I have a feeling you'd get along very well with a guy who was in my class the last three years: He didn't mind using whatever languages came our way, but if he could choose, he used 68k assembly. It was also what he used to understand how assorted algorithms worked at a low level: By the time he'd implemented something like a binary tree on his amiga, he understood it.

I'm slightly younger and has a somewhat different background. I can read assembly given some time and I've written some ultra-basic code in it. (I think I got as far as reading and printing text from a file in alpha assembler using BSD syscalls). I also like to think that I understand the general idea of what actually happens when this code runs.
However, when I wonder how something complicated works on a low level, I think "how would I do this in C". This does not mean that I would neccesarily implement it in C, but it's a convenient lowest level of abstraction for me, low enough to let me have a chance of feeling when I'm wasting time or space.
In the end, the specifics probably don't matter, so your point definitely stands: You should strive to understand what happens when your code runs, on a low enough level to understand why it acts as it does.

I think this is connected to learning new languages. A different language is mostly another way of getting the same things done, so on some level it has to work out to a similar set of low-level work. You just have to find the way to specify it.

Still, it would perhaps be fair to call me a top-down type. I learn enough to get what I need done, then I expand it to enough details of the language to see why things work (within the language), and during this I begin thinking about how it works on a lower level. My knowledge of the lower layers is aquired on a what-interests-me-today - basis, so it would be hard to pick out any real direction to it.

If I were to give any specific advice to aspiring programmers, it would be to learn a second language as soon as you feel comfortable with your first. If you begin with perl, I'd suggest trying one of the stricter ones next. C, perhaps, to appreciate the work that lies behind the conveniences of perl [1]. Java isn't a bad idea either, the way it forces object orientation over your head to do the simplest things will definitely force you to understand some concepts. Of course, it might be easier to strike out to something much closer to perl, such as PHP.
When you get used to different languages and styles, you begin using the better ideas with other languages than you learned them in. (There's something definitely OO-ish over my C code.)

As for me, my first language was BASIC on an ABC80 (Z80, basic-in-rom, made in 1979) early in the '90s [2], followed by qbasic and some borland pascal on a PC. I got comfortable with programming in general with qbasic. I think I played with VB a bit over halfway through the decade, and around 2000 I began toying with linux and FreeBSD. I was mainly tinkering with python on FreeBSD until I began studying informatics in 2003. During the last three years I've had to learn PHP, javascript, ASP, ASP.net (using vb.net), C#, java, C and a bit of C++, plus a bunch of shellscripting to tie it all together. And let's not forget the SQL and PL/SQL, or the courses in object-oriented project structuring and patterns. (I am trying to forget the Flash, though, and I don't consider HTML, XML or CSS to be programming languages.)

I'm actually happy with my studies. They've been very practically oriented, and the overall idea seems to have been to expose us to so many languages and techniques that it will be easy for us to learn more later. Given the impression I've gotten from what few interviews I've been to so far, the mix of knowledge I've ended up with seems to be employable, too.
Besides, anything that lets me take practical ovnership of an 8-PC minicluster to run a C-program I've written, (using a benchmark-script and statistics-script I've also written) for a few weeks can't be all bad. :p

[1] If you're on a *nix system, C is an even better idea. It's everywhere, and the definite way to use a lot of libraries and other conveniences you might one day want need.
[2]If you're curious, I was born in 1983.
 
Excellent article mike, thanks for writing it!

I too find a certain disdain for our education system in this country. Like you I knew what I wanted to do at an early age. I began programming by writing BASIC programs on a V-Tech toy "computer" when I was very young. Until my senior year of highschool there were no class options to satisfy my desire to learn so I ended up teaching myself everything that I knew of C++ by that time. In college (as a CS major) I found most of my programming courses to be unchallenging, uninteresting, and uninspired, not to mention repetitive. You can only write bank software and simple searching/sorting algorithms so many times before you wonder why your paying tens of thousands of dollars for this... While most of my classmates struggled with even most basic concepts I was bored out of my mind and craving more. To make matters worse my schedule was crammed so full of BS liberal arts classes that I was practically unable to persue my interests outside of school either. I mean, I am a CS major in college, I know what I want to do, I don't understand why I have to take health and fitness (PE requirement), biology 1 and 2, geology 1 and 2 (2 natural science sequences requirement), multiple history courses, creative writing and several other writing courses... etc etc etc. I understand it is important to be well rounded, but less than half of the courses I've taken so far have had anything to do with my major, and the ones that have were trivial and tought me next to nothing. I am starting my 3rd year this semester and I really hope things start to change, 2 of my 4 courses are related to computer science (Databases, Software Engineering, Spanish, Insects and Society), which is better than most previous semesters...

I am actually pretty excited about software engineering, though databases will be probably be a bore as I can already set up an SQL database driven by PHP for use with forums and whatnot... It doesn't seem like a very "deep" topic if you know what I mean.
 
CodeX said:
I am actually pretty excited about software engineering, though databases will be probably be a bore as I can already set up an SQL database driven by PHP for use with forums and whatnot... It doesn't seem like a very "deep" topic if you know what I mean.

While I have a feeling that you're right about your database class, hopefully it will cover some of the "low-level" workings of a relational database. The ability to set up an x-normal form database on Y-company's DBMS is a useful skill. But, do you have enough of an understanding of the relational model to develop your own (albeit simple) database backend? And how efficient would your solution be in terms of physical memory and speed?

While your class may not cover these topics in much depth, it sounds like you are finding your classes easy enough that you could do some independent study on the side. Relating back to both Mike's and HHunt's posts, understanding the server-side operation of your chosen database will help you to write more efficient queries (although advanced server-side query optimization techniques are, I believe, making that more difficult / less necessary.)
 
This thread has a list of projects that I put together for someone else. They're of a varaiety of different levels -- but so are people, over time.

I'm a little embarrassed this essay started geting so much attention; I've always meant to revise it and clean it up. Integrating that list of projects would've been one of those things to do.

I understand it is important to be well rounded said:
That's relly bad news. Like DrBeagle suggests, you really should investigate some self study stuff, find a mentor, and so on. You really need to do this right away because you have lots of time and energy and your head is soft. It is much harder to do when you're older.
 
If you believe in book sales (from a single publisher) as an indicator of technical trends, you might find the State of the Book Market post in the O'Reilly Radar Blog interesting. If anything, I think it's a useful indicator that there's still at least a few derivatives between hype and trend.
 
Although, i skimmed this essay while asleep in class (which kind of puts me against the essay since i'm not paying attention), i think this essay was very well written and has many good points.
 
I have added a section called "More notes about Becoming Employable" to section #2.
 
Didn't want to bump this thread but felt I'd mention...

I'm at www.digipen.edu right now (2nd semester) and our CS100 course involved writing in assembly for the PIC18F452 Processor / Programming a remote control car without a remote control (uses sensors to detect distances from walls). But the book we were recommended to read was “Code: The Hidden Language of Computer Hardware and Software”, by Charles Petzold... and it was quite fascinating, I got caught up in my other classes and never finished it but I plan to go back to it. And I'm a guy who rarely reads books unless it's required.

I'm planning on forwarding this essay to my C/C++ instructor who loves these kinds of things... I really love this school's specific courses / teachers. You can't take these core classes at other schools and try to transfer out of them here (Most don't exist at other schools), and the teachers are some of the best I've come across. The general education is a different story sadly, which is why I'm planning to take that stuff at a cheaper community college and transfer over.

The list of classes is just insane, and it's intimidating/exciting at the same time... Computer Science Courses

Just felt it was sorta relevant... heh... In the middle of reading the C++ Primer Plus... we focused on C first semester, now moving to C++ for this semester... not forgetting stuff from C just expanding on it.
 
Last edited:
I'd love to get in touch with your C/C++ professor; my company has a close working relationship with Digipen, and if you can pass along his contact info in a PM ... The "Computer Environment" intro courses sound like a great way to start, and help with early failure, too.
 
The CS100 course is actually taught by a different teacher who focuses on the computer engineering / physics side of it. But I can send you info for both of them...

Also just noticed, the description for CS105 is actually what we did... I think it used to be two courses, but the first half was focused on number systems so having an entire semester for that felt kind of pointless. So I think they combined them to help with that.
 
Last edited:
Thanks for the clarification. It's hard to read the page you referenced, as none of the links work.
 
"There's nothing wrong with being a mechanic. But some people are going to be much happier designing engines."
^-- that quote should be in a book somewhere. :)

Maybe the essay is too subtle, then. The point is that people who are asking what programming language they should learn (first, or next) are usually just programmers (or, say, IT workers). An engineer (or, say, a CS student) is going to realize that it's the problem solving issue that's important; that the language is just an expression of a solution, and that a deep understanding is important.

There's nothing wrong with being a mechanic. But some people are going to be much happier designing engines.
 
"There's nothing wrong with being a mechanic. But some people are going to be much happier designing engines."
^-- that quote should be in a book somewhere. :)

I tend to lean toward Joel Spolsky's theory that not everyone can program, and most programmers can't program. I work in IT, and I have seen some HORRIBLE software. I have had to try to fix software that places files in weird places, or software that doesn't do what it says it should.

Symantec End point Protection 11 is a fine example of crap programming. The initial release didn't clean out the virus updates. I have seen a filemaker (think a physical file), break, when a drive had no space left.

These probably could have been stopped had the software been properly tested.
 
Very good article. A+ job.

I think one thing that often gets left out in the learning/school phase is working with other people. When people are just starting out or learning, they are always working by themselves. The majority of college classes have you doing your own projects. This causes some problems when you go to put your skills to use at a company. It's extremely rare that you'll actually work alone. This is a bit of a problem for me because I never learned to articulate what I'm thinking. And when I'm listening to someone else, even though I may understand the concept of what they are trying to explain, their words will go right over my head. Someone will tell me something and it will make no sense at all. Then I'll see it and go "Ooooohhh, OK." That's all because I don't have experience working with other people in the development process. The way you tackle problems changes when you work in teams also. I'd advise people to start working in groups as soon as possible. Learn new things on your own, and then go back and teach them to the group. Discuss it and improve upon it as a team.
 
excellent necro-thread. This should probably be stickied.

I view programming as a bit of an art form. Most of the programmers I have seen tend to be mechanical in nature. That works fine for a lot of purposes but also creates monstrosities in the code base. Then again when you talk about art as a programming style, that can also take people off on a tangent and result in something that is unworkable or endless delays. So probably the best programming style will be somewhere in-between.
 
I tend to lean toward Joel Spolsky's theory that not everyone can program, and most programmers can't program. I work in IT, and I have seen some HORRIBLE software. I have had to try to fix software that places files in weird places, or software that doesn't do what it says it should.

I'm not sure that most programmers can't program, but I think many can't. When I interview people who claim to be "software engineers", the simple coding tests that they're likely to fail are very surprising -- someone with 10 years of experience just can't have any reason to no code something like fizz buzz for me on a whiteboard, but it happens all the time -- so often that we have to tailor our interview process around the idea of failing early so that we don't spend too much time on candidates with great resumes but no actual skills.

Placing a file in the wrong place, though, isn't really an aspect of programming.

If you're seeing these things in your corporate environment, then I'd assert that your organization has some management challenges -- that they're not good at controlling projects, not good at listening to customers, or not good the hiring process. Perhaps some combination of those things.

Symantec End point Protection 11 is a fine example of crap programming. The initial release didn't clean out the virus updates. I have seen a filemaker (think a physical file), break, when a drive had no space left.

These probably could have been stopped had the software been properly tested.
I'm not sure that I can agree, though I'm not sure what you mean by "filemaker" or "think a physical file". Proper testing is an aspect of software development, but some programmers don't think quality assurance or good design -- the things you're talking about -- are part of their job. Depending on the organization, they may or may not be.

Very good article. A+ job.
Thanks, I'm glad you liked it.

I think one thing that often gets left out in the learning/school phase is working with other people. When people are just starting out or learning, they are always working by themselves. The majority of college classes have you doing your own projects. This causes some problems when you go to put your skills to use at a company. It's extremely rare that you'll actually work alone.
I agree. The reason might be that many schools don't have curricula that focus on large project scale. I see many students posting here about their "huge" program, which isn't even three pages long and doesn't have any separate modules or libraries or header files. Learning how to factor and design for scale is a part of learning about encapsulation and functional partitioning, and it seems like nobody can be a good engineer without it. How do the schools communicate this to students?

This is a bit of a problem for me because I never learned to articulate what I'm thinking. And when I'm listening to someone else, even though I may understand the concept of what they are trying to explain, their words will go right over my head.
I can't figure out how you might understand the concept but not the words. If you're having trouble understanding someone who's talking to you, you might try asking questions. There are courses on critical questioning, and I think such a course is extremely important engineering students of any discipline.


excellent necro-thread. This should probably be stickied.
For some reason, this forum doesn't have stickies. There's just one, which includes a list of links to all the threads that are stickied. It's an odd way to run a ship, but last I checked that post included a link to this thread. Anyway, I'm glad you enjoyed the essay.

I view programming as a bit of an art form. Most of the programmers I have seen tend to be mechanical in nature. That works fine for a lot of purposes but also creates monstrosities in the code base.
By what mechanism are those monstrosities created? I'm not sure I follow you.

Then again when you talk about art as a programming style, that can also take people off on a tangent and result in something that is unworkable or endless delays. So probably the best programming style will be somewhere in-between.
I guess so.
 
mike-

Just two examples of software that wasn't tested properly before it was released.

The filemaker was a chart making software for doctor's charts/dentist charts. This software would break when the drive it was stored on was full.

I wish companies would test software properly before they rush it out, and make the rest of us deal with their half baked plans.

Here is another story about software not working as expected:

http://www.tomshardware.com/news/Final-Cut-Pro-X-Refund-FAQ-Compatible-Final-Cut-Pro-7,13026.html

In my experience working on fixing software that breaks, I see that most of the software is either poorly designed or not designed at all. My personal take is that it is developed by programmers who went to school, got a degree, and got hired. They have little to no interaction with customers.
 
Back
Top