Slashdot Mirror


Taking Your Programming Skills to the Next Level?

An anonymous reader asks: "About 6 years ago I graduated with a degree in Computer Science. Since that time I've been working on and off as a programmer, however I feel that my programming skills haven't really progressed to the next level as I had hoped. I guess part of the problem is that my work environment hasn't been especially technical or challenging, so I really need to try and improve my skills independently. What strategies did Slashdot readers use to improve their programming skills Which books are useful in this area?"

240 comments

  1. It's not the eyes, but the brain by Pig+Hogger · · Score: 5, Informative
    Reading books is one way, yes, but like muscles, the brain must be exercised.

    Practice. Learn a new language, just for fun. To do so, program a new application to do something useless that has been nagging you for months.

    1. Re:It's not the eyes, but the brain by eln · · Score: 5, Insightful

      I may be wrong, but the submitter doesn't seem like the type who's going to pick up another language or solve some useless problem "just for fun." That's okay though, because I'm the same way. I hear about people who program shit in their spare time just to solve trivial problems, and I just cant get into that. However, I am a fairly good programmer. In my case, the reason I became good is because I went to several different jobs, and in each job there was some sort of major problem that the company or team had been dealing with for a while, that I decided I could solve. The difference between that and solving useless problems in my spare time is that a.) it makes my job easier, and b.) I'm getting paid for it.

      I've made most of my money over the years (not that I'm a millionaire or anything but, hey, I'm still young) doing automation work. I see a manual process being used, decide it can be automated, and I automate it. That's the sort of programming that really gets me going: programming that makes life easier.

      So, I guess my advice for those unmotivated to do things on their own time would be this: Find a problem at work that can be solved through some sort of program. Solve it. This could be automation of a monotonous task, or it could be writing an application to replace some boneheaded spreadsheet that everyone has been using for years to track inventory.

      The upshot of all of this I guess is that I agree with you that practice makes you a better programmer. However, I would encourage people to look for problems in their work lives that can be solved through programming if they are too unmotivated or otherwise occupied to program in their spare time.

    2. Re:It's not the eyes, but the brain by __aaclcg7560 · · Score: 2, Interesting

      Or create a website as an ongoing programming project. Adding new features, maintaining current code, and rewriting code where necessary. There's nothing more horrifying than trying to figure out what you wrote six months to a year ago. I'm currently learning Python as a new language to know and figuring out if a Python-based web framework would be a good approach to building the admin backend that I was too lazy to write during the summer.

    3. Re:It's not the eyes, but the brain by MassEnergySpaceTime · · Score: 1

      I agree with your post 100%. It is most fun, educational, and rewarding when you solve a useful problem, because you take more from an experience where you know the solution was definitely a productive or beneficial one that you can apply to similar problems in the future, thus taking your skills to "the next level".

      I think it all boils down to feedback. When you write code to solve an actual problem, or to improve something, you KNOW you did something good, or even something wrong. In either case, you learned something, and you improved. When you write trivial code for yourself for fun, all you learn is that you CAN do something, but not if you SHOULD or SHOULD NOT do something.

      --
      Respect the laws of physics, for the laws of physics have no respect for you.
    4. Re:It's not the eyes, but the brain by Anonymous Coward · · Score: 0

      "I've made most of my money over the years (not that I'm a millionaire or anything but, hey, I'm still young) doing automation work. I see a manual process being used, decide it can be automated, and I automate it. That's the sort of programming that really gets me going: programming that makes life easier."

      The medical industry will love you. Try automating a hospital, keeping in mind a lot of the problems aren't technical.

      "However, I would encourage people to look for problems in their work lives that can be solved through programming if they are too unmotivated or otherwise occupied to program in their spare time."

      User Interfaces are challenging enough.

    5. Re:It's not the eyes, but the brain by Aladrin · · Score: 4, Interesting

      I think it's also quite a bit easier to 'take your skills to the next level' when you have outside pressure to do so. Doing projects in your free time is great, but there's no great push to overcome challenges like what you get while doing 'work' for a company.

      I'm one of those people that program for fun in their free time. For years, I resisted becoming a professional programmer because I didn't want to taint my hobby. I finally realized that I needed to do SOMETHING for a job, and got a 2 yr degree for the paper. 4.0 GPA because I already knew it all, having learned it myself over the previous 10-15 years. (Yeah, I started programming young.) In the last year at this company, my skills have progressed more quickly than the last 10. Having your boss say 'The entire system is down. We need a fix.' has motivation like nothing else. I've learned languages and concepts both. I'm a much better programmer than I was a year ago.

      So in the end, the answer is: No book will help you like a good job will. Programming projects in your spare time is better than a book, but not by much. (The 2 together can be useful, though.)

      --
      "If you make people think they're thinking, they'll love you; But if you really make them think, they'll hate you." - DM
    6. Re:It's not the eyes, but the brain by SQLGuru · · Score: 3, Insightful

      The parent post is alreday +5 Insightful, but I'd like to add that another way to get better at programming is to find a mentor.....a good mentor. I made the biggest leap in my ability during my first job (which was rather fortunate). I was on a team of young guys, but we were all sharp. Where one of us lacked, the other was strong. After 5 years, I was a very well rounded programmer. I try to continue that by always having someone that I've taken under my wing to mentor as well. So, if you're in Austin and want a top notch database programmer (not a DBA) to be your mentor, look me up.

      Another area that will help you is breadth of knowledge. You don't have to be an expert in everything, but be aware of many fields (different tiers, different languages, different layers of the network model, what have you). This helps because you will quit fighting to put part of a solution in the wrong layer. If you can push it to the right layer, your solution will turn out better (easier to write, easier to maintain, more robust code, better overall design).

      Layne

    7. Re:It's not the eyes, but the brain by pizza_milkshake · · Score: 1

      I tend to do small exploratory projects to introduce myself to a topic or to try and solve a problem. For example, after testing the scalability of an application at work (which didn't scale badly) I did some research to try and figure out how I could reshape this app in the future to be maximally-scalable. I started a small project of a barebones webserver, and updated it as my knowledge grew. One can read all the tutorials and books in the world, but you don't really know something until you do it. So in the end I know how to scale networking I/O up 10x what my previous knowledge allowed. Practice projects won't make you an expert on the topic, but at worst they at least help you identify the right questions.

    8. Re:It's not the eyes, but the brain by testadicazzo · · Score: 1

      Even though the OP's workplaces and tasks have not been terribly challenging or technical, this doesn't have to slow down your progress as a programmer.

      As the parent says, find tasks at work that can be automated, that will give you a certain amount of training. If you really want to improve your skills, shop around for books or websites that discuss programming techniques and strategies you are interested in, which you think would make you a better programmer, and seek to apply these techniques to problems that you have to work on, including those assigned to you. When programming you usually have a million different ways you can solve any problem. If your goal is to get the programming task finished as quickly as possible, you wind up using the same toolbox for all problems. If you have the time though, study on your own, and try to apply what you learn to your work problems.

      I studied physics and later computational physics. I had a few programming classes, but nothing too terribly sophisticated. I'm still working in my field, and I have purchased most of the 'C++ in depth' series of books (template metaprogramming, exceptional c++, c++ coding standards, etc). When I'm reading these books, or browsing programming websites or reading c++ newsgroups, I look out for ideas and strategies that might pertain to problems I am currently tackling, or will soon be tackling. Sometimes I deliberately research new strategies for a particular problem becuase I know my current toolbase isn't ideal for the task. I'm a much stronger programmer than I was last year thanks to to this, but I will adimit that there is a small performance penalty. On the other hand, at some point you get a return on that investment, especially if you try to learn things that will benefit you or your code down the line.

      When faced with a task, including boilerplate stuff that I've done a hundred times before, if I have the time I try to think of several ways of handling the proble, analyse the best way and implement that. If I can think of new or more interesting approach that lets me develop my skills and doesn't penalize my coding then I choose that method.

    9. Re:It's not the eyes, but the brain by Kamots · · Score: 1

      I find that I don't have the motivation to a new language or programming style by working on trivial projects. However, I find that if I find a project with significant scope to work on, then I have more motivation to work on it.

    10. Re:It's not the eyes, but the brain by indraneil · · Score: 2, Interesting

      I can only speak for myself and this is what happenned to me. 2 years into my job out of college, I got into a rut! Work was not really throwing up any challenges and I really was not progressing fast enough!
      I must have been mad, but I registered for Grad school and started attending classes while staying at my job!
      Man - was it hard!
      The good things that happenned were -
      - College really forced me to solve non-trivial problems under simulated circumstances.
      - College forced me to submit solutions in languages that I do not use at work
      - College forced me to study subjects that I would never be exposed to at my work place!
      - Also interestingly, I have more respect for software licenses now and rather than use cracked software (as do most college students in my part of the world), I stuck to hand coding (often without IDEs)
      - Often, I coded my problems on one OS (have to use windows at work) and was evaluated on a different one (mostly Linux). That made me more aware of platform dependencies, even in languages like Java etc.

      I have a supportive wife, and my office is accomodating enough, so I have survived thus far. But it is also true that the entire soup I got into has forced me to upgrade my skill sets. I would not recommend usage of my methods without caution, but it sure is doing wonders for me!

    11. Re:It's not the eyes, but the brain by hondo77 · · Score: 1

      There's nothing more horrifying than trying to figure out what you wrote six months to a year ago.

      Not to take a swipe at you but for some reason I have seen this phrase popping up over and over in the past two weeks (it's come up twice in a book I'm currently reading) and I think it is such crap. IMO, if that is the case then you're a lousy programmer or, more charitably, still have a ways to go with your craft. I actually get a big smile when I have to go through my old code because I get to see that those comments I wrote, those names I chose, that extra time I spent doing things right are actually paying off because I can get back up to speed and make the changes I need to fairly quickly.

      Again, this isn't really directed at the parent. I just wanted to let off some steam on the topic. Back to Mr. Conway's book.

      --
      I live ze unknown. I love ze unknown. I am ze unknown.
    12. Re:It's not the eyes, but the brain by randallS · · Score: 1

      Having a "breadth" of knowledge, unfortunatly, doesn't always help a whole lot on the resume.
      Take this example of a career path and what it shows on the resume:

      years 1-2 : system admin and C/C++ developement on both unix and MS, some random database work, with a little html as "the web" takes off.
      years 3-6 : "ASP" based web development, with MSSQL for the backend database, and Verity search engine, a lot of Access DBs, and perl back end applications, and some ".bat" scripting
      years 7-8 : convert ASP applicatons to .NET, using C#.
      years 9-10: new job dealing on verity search engine, but using java/JSP (tomcat) on linux this time, some perl and a lot of shell scripting in the background. Plus add in SAP portal application development and oracle.
      Plus, all this time, using various flavors of linux at home, some perl cgi pages for friends and family.

      A well rounded background. I got 10 year of experience, unix, linux, MS windows, perl java, c/c++, asp, jsp, SAP (and its j2ee), etc.

      However, on the resume, it looks like:
      2 years Java
      2 years SAP,
      4 years ASP
      2 years .Net
      6 years perl
      2 years oracle
      7 years MS SQL, but none of it was MSSQL 2005...
      etc.

      10 years web application programming, but the only buzzwords anyone cares about is "java" or ".net", or "python" or "php", and while I am confident I can go pick any language, google up the reference, and write complex applications using it, I can't point to a company on my resume where I used it professionally for 5+ years....

      I do have 8+ years of Verity search engine experience, which in some circles, is a good thing, but the companies using it are few and far between, so finding a job with it takes time, and generally involves long distance travel.

      Granted, there is the occasional platform agnositic shop which actaully likes someone with a variety of experience, but usually all they want is 5-8 years experience in only one language, on one platform, using one set of tools the whole time. The numbers next each particular buzzword needs to be high enough for them to be interested. Having a variety of buzzwords availble doens't help much. Their HR department only sees the buzzwords they were told to look for.

      And saying "I wrote some programs using X on my own" as the answer to "which company did you use X at" usually gets dismissed out of hand... They tend to only be interested in claims where you can point to a reference who can back up your claim.

      So, in the end, getting *useful* job skills (resume wise) is really dependant on the jobs you happen to work at. If you're already someplace where they decide that "new technology X looks cool, lets try using that", then you get a chance at getting some experience in it. Otherwise you need to find a job because they are looking for skill Y (which you have experience in), and then get to learn skill X there because they happen to use that as well in their shop, even though it wasn't important in their hiring requirements.

    13. Re:It's not the eyes, but the brain by __aaclcg7560 · · Score: 1

      It's all part of the learning process. When you code today, you're going with what you know today. A year from now, you may do it differently or recognize now what you should have done back then. Not everyone writes code or make design decisions brilliantly the first time around.

    14. Re:It's not the eyes, but the brain by Fastolfe · · Score: 1

      I second this. My web site isn't really for visitors, it's for me. Every few years I completely rebuild it using whatever technology happens to have my interest at the time. Since my goal isn't to create a new web site, I have no pressure to rush through things to reach the goal, which means I can take it slow and figure out how to do things the *right* way. This way I'm not learning fast-and-dirty programming skills (the path to products of inferior quality), I'm learning best practices, and the art behind the programming.

      (IMO.)

    15. Re:It's not the eyes, but the brain by try_anything · · Score: 1
      In my case, the reason I became good is because I went to several different jobs, and in each job there was some sort of major problem that the company or team had been dealing with for a while, that I decided I could solve. The difference between that and solving useless problems in my spare time is that a.) it makes my job easier, and b.) I'm getting paid for it.

      I've found that very fruitful as well, because you're guaranteed to get genuinely hard problems and develop genuinely rare and valuable skills. You may have difficulty getting official approval to tackle an "impossible" task, but you can still work on it in your spare time. Three tips to anyone taking this route:

      1. Keep your off-time work quiet. Management may not understand that you're doing it as a personal choice in your spare time; they may reason that if you're working on something useful to the company, then you're at work and they have the right to decide what you work on and how. Definitely avoid using scarce company resources. Rather than going through official channels to acquire assistance and information, go straight to the source. Use beer.

      2. As soon as you have convincing evidence that it will work, call it a prototype and get official approval to finish it. Even if it's already completely done, still call it a prototype and get official approval to finish it. This helps with item 3:

      3. After the fact, make sure management has a clear idea how much time went into it. This isn't just because you want to brag about how hard you're working; it's because their expectations of what it will cost to improve and maintain it will be based on how much it costs in the first place. If they think it appeared magically, they will expect you to maintain it magically, too.

      After you do one or two projects like this, people will start to ask for you to tackle their irksome tasks. Your manager will lend you out to people with hard problems in exchange for favors back from them. Nice life :-)

  2. Good Idea! by buswolley · · Score: 1

    Yeah cuz programmers definitely need more hitpoints.

    --

    A Good Troll is better than a Bad Human.

    1. Re:Good Idea! by Perseid · · Score: 5, Funny

      White programmer needs Dew badly.

    2. Re:Good Idea! by Anonymous Coward · · Score: 0

      Take it up to level NINE THOUSAAAAAND!

    3. Re:Good Idea! by AcidLacedPenguiN · · Score: 1

      I don't know about anyone else, but whenever I hit that compile button I always hear the FFVII won a battle theme and when I see the errors pop up it's like I've hit another random battle, that's just how I roll. . .

      --
      disclaimer: I've been known to store numbers in my ass for which to dig out when quantities are required.
    4. Re:Good Idea! by Anonymous Coward · · Score: 0

      Lol, /b/tards on my Slashdot.

    5. Re:Good Idea! by miyako · · Score: 1

      Thanks very much, now that is going to happen to me from now on....although I think it might be more appropriate to hear the battle music while the compiler is running, then hear victory when you compile without errors (of course when your program segfaults that's like beating a boss then having your dog trip over the power cord and then you have to fight the boss again...)

      --
      Famous Last Words: "hmm...wikipedia says it's edible"
    6. Re:Good Idea! by Anonymous Coward · · Score: 0

      I'm in your message board, posting your memes.

    7. Re:Good Idea! by Anonymous Coward · · Score: 0

      hay /. wuts goin on?

    8. Re:Good Idea! by Anonymous Coward · · Score: 0

      ITT Tits or GTFO.

    9. Re:Good Idea! by ahmusch · · Score: 1

      Programmer shot the Dew!

    10. Re:Good Idea! by Anonymous Coward · · Score: 0

      does this count as slashdot gray area?

  3. Find a new job. by Bitsy+Boffin · · Score: 5, Insightful

    If your current job isn't challenging you, then get out of it now. Do not delay.

    All you are doing is painting yourself into a corner skills-wise that is going to get harder and harder to get out of later. The longer you're doing this basic stuff, the rustier and rustier all the real actual knowledge you got out of your degree is becoming.

    Employers don't want rusty people, they want people with skills already.

    Get out now.

    --
    NZ Electronics Enthusiasts: Check out my Trade Me Listings
    1. Re:Find a new job. by The+MAZZTer · · Score: 5, Insightful

      Err... ideally you'd want to find your new job BEFORE quitting your old one...

    2. Re:Find a new job. by PoderOmega · · Score: 4, Insightful

      I don't have mod points, but I totally agree with this. I have been out of college for 5 years, and my first job took about 2 years to basically learn all the existing code and my job got to the point where it was too "boring", so I spent a year trying to take my skills to the next level. Well, I learned some stuff but switching jobs took me to the next level 10 times faster then me reading a book and playing around with stuff on my own. Working with bigger systems and more advanced programmers really brought me to the next level. Now I am to the point where it is getting boring again and I am not sure what I can do to keep learning without jumping ship for bigger brighter things.

      Do you work with other programmers? Are they content to spin their wheels all day? Competition can also be good thing, and its nice to have someone else really into coding.

    3. Re:Find a new job. by __aaclcg7560 · · Score: 2, Interesting

      Why not? Spend six months on unemployment while hanging out at Starbucks with a laptop looking for jobs, learning a new programming language and working on an open source project. Maybe get lucky with the goth chick working behind the counter.

      Seriously, this can go either way. I've known people who were responsible enough to get a better paying job after their little vacation was over, and others who ended up working at 7-11 since they didn't do squat to improve their chances of getting another job.

    4. Re:Find a new job. by Barny · · Score: 1

      Hrmm, survival of the fittest job wise, works in nature, why not here? :)

      And besides, that goth chick does look hot ^_^

      --
      ...
      /me sighs
    5. Re:Find a new job. by o2sd · · Score: 3, Interesting

      Agreed. My personal strategy that has worked very well for me so far is that if the programming is boring, then there is nothing at stake. The easiest way to make programming interesting AND take it to the next level is to find a job with a lot more risk involved. This usually involves either (1) Look for a company that is smaller by half (at least) than your current employer or (2) Be on the lookout for companies who are about to engage in something that would be considered too risky at your present location.

      Now I am not recommending this approach for everyone, I'm just saying it works for me. More Risk == Better Programming

      YMMV

      --
      - Nothing to see hear.
    6. Re:Find a new job. by bzipitidoo · · Score: 1

      I wouldn't be so quick to dump a job just because it's boring. Are the people nice? And I'd certainly consider the economic climate. I've been in some very bad jobs, with lots of stress, impossible demands and schedules, and horrible incompetent backstabbing managers and coworkers who thought the way to run a program was lie, b.s., cover up, play people against one another, abuse or ignore underlings, and shift the blame. Those are reasons to quit a job. That kind of hell job had me wishing for a boring job. As the Chinese curse goes, "may you live in interesting times".

      --
      Intellectual Property is a monopolistic, selfish, and defective concept. It is "tyranny over the mind of man"
    7. Re:Find a new job. by Ginger+Unicorn · · Score: 1

      how hot do you think you'd look sitting in starbucks all day programming on your laptop? i don't think she'd be impressed. :p

      --
      (1.21 gigawatts) / (88 miles per hour) = 30 757 874 newtons
    8. Re:Find a new job. by Anonymous Coward · · Score: 2, Insightful
      Why not? Spend six months on unemployment while hanging out at Starbucks with a laptop looking for jobs

      Becuase you don't get unemployment if you quit.

    9. Re:Find a new job. by Anonymous Coward · · Score: 1, Informative

      This is the worst advice ever. What if he can't find a job he likes in that time? What if the economy takes a shit?

      And also, employers will offer you less money if they know you don't have a job. This is proven, 3 out of the last 3 companies (ranging from tiny to humongous) I worked for knocked an offer down 10-20% if they know the applicant doesn't have a job and has not had one for more than a month. Not having a job also makes you less likely to get your foot in the door. I think its kind of silly, but if you don't have a job now, hiring managers tend to look at you as used goods that there must be something wrong with.

      You are essentially rolling the dice with all of these factors.

    10. Re:Find a new job. by __aaclcg7560 · · Score: 1

      I had a co-worker who already got another job that wouldn't be starting for a month but didn't want to stick around for another and didn't want to lose a month's income. He violated all the security rules by leaving his work out on his desk, not locking up sensitive equipment and items, and taking the password off his screen saver to allow anyone access to his machine. It took a week for the supervisor to hear through the grapevine that this was going on, which made the supervisor look bad since he was supposed to be checking for this stuff every day, and my co-worker was promptly fired to collect a month of unemployment.

    11. Re:Find a new job. by Anonymous Coward · · Score: 0

      Spend six months on unemployment

      Yeah, about that, the drugs keeping my brain from turning to mush are over $1000 a month, and if I went 6 months without insurance, no insurance company would cover my MS treatment, they'd all call it a pre-existing condition, and would probably call everything else that happened to me "MS related" as well.

      Of course, I do have the cash to go 6 months without dropping my prescription, but I'd have to be going into a $70k+/yr job at the other end to make up for the loss of insurance.

    12. Re:Find a new job. by bladesjester · · Score: 1

      I know I'm probably going to get flamed by someone for this, but you'll find that a lot of the "leave your job" people are basically in a pissing match to try and make themselves either look cool (it doesn't work) or convince themselves that that is the way everything should work.

      The macho crap amuses me. Found a job that you like which pays well, is stable, doesn't make you want to rip out your hair, and is in an area that you enjoy? good for you. Don't worry about the perpetual job hoppers. Do, however, try to keep your skills sharp just in case something happens.

      In a bad situation? In that case, by all means, try to get yourself into a better place.

      --
      Everything I need to know I learned by killing smart people and eating their brains.
    13. Re:Find a new job. by mrzaph0d · · Score: 1

      besides the fact noted below that unemployment isn't available if you quit, do you know how little it actually pays? i do. very little. veeeeeery little. unless you've got some savings to hold you up for those six months, don't expect to be able to eat or pay your bills with what you'll get.

      --
      this is just a placeholder till i send back my real sig from the future.
    14. Re:Find a new job. by __aaclcg7560 · · Score: 1

      I've known people who took a six months vacations during the last six years when the economy wasn't too hot. If you kept your job skills up to date and been diligent in looking for a job eight hours a day, you will found a job sooner or later. If you cruise through life, your next job will be 7-11 on the graveyard shift. It's a gamble I wouldn't recommend but some people get this mind set that they can relax for a while on unemployment and get a job with the snap of the fingers.

    15. Re:Find a new job. by Reservoir+Penguin · · Score: 1

      Well, to this guys defense maybe he lives in a European country where one doesnt have to take the first job availible but actually got time to research what best suits his skills, without starving to death in the meantime that is.

      --
      US-UK-Israel: The real Axis of Evil
    16. Re:Find a new job. by __aaclcg7560 · · Score: 1

      If you manage your career wisely, you should always be able to pick the job that want without circumstances forcing you to take a job you don't want.

    17. Re:Find a new job. by Reservoir+Penguin · · Score: 1

      Right, and if you manage your finances wisely you wouldnt need universal healthcare and public schools and you can work you way up to the top starting with a few pennies. But in reality social structure should work well for an average person who sometimes makes career and financial mistakes.

      --
      US-UK-Israel: The real Axis of Evil
    18. Re:Find a new job. by anomalous+cohort · · Score: 1

      Yes, that is true. Find the new job before quitting the old. Personal and professional growth is absolutely a part of the decision criteria for selecting and staying with a job. The fact that it has taken the original poster years to figure this out does not say anything positive about his or her drive.

      Read some books. Here are some recommendations.

      • The Practice of Programming by Kernighan and Pike is an all time classic. This one is my strongest recommendation.
      • Is object oriented programming the next step for you? Here is a classic by Grady Booch.
      • I find Martin Fowler to be a great author on next step kinds of topics for software developers.
      • Are design patterns the next step for you? The original GoF book is my recommendation.
      • Are relational databases your next step? My favorite book on this subject is a LAN Times Guide to SQL.
      • Is the next step to be a team lead? Then you should really read Code Complete by Steve McConnell.
    19. Re:Find a new job. by JavaLord · · Score: 1

      Well, to this guys defense maybe he lives in a European country where one doesnt have to take the first job availible but actually got time to research what best suits his skills, without starving to death in the meantime that is.

      Yes, we all see the news stories about the programmers who quit their jobs then starve to death in the evil USA.

    20. Re:Find a new job. by JavaLord · · Score: 1

      The macho crap amuses me.

      Quitting your job because you are bored isn't macho, it is dumb. Dragging your ass to a job you hate for 40 years for your family is macho.

    21. Re:Find a new job. by Reservoir+Penguin · · Score: 1

      Assuming you're serious (seriously ignorant) - there are untold numbers of programmers in the USA who had to accept low paying unskilled positions, in order not to starve to death.

      --
      US-UK-Israel: The real Axis of Evil
    22. Re:Find a new job. by ahodgson · · Score: 1

      Having to accept an unskilled position is not starving to death. It's doing what is necessary to take care of yourself. Are you seriously suggesting that money stolen from taxpayers should be used to pay people just because they are unwilling to work in a job in something other than their chosen field?

    23. Re:Find a new job. by Reservoir+Penguin · · Score: 1

      Completely serious, it's more beneficial to society to allow a skilled engineer to spend several months or more looking for a suitable job than have him deskill himself serving hamburgers, installing cables or doing tech support. If your country's s Supreme Court believes that it's ok to demolish local businesses to make place for Wallmart because it pays more taxes then it's also more beneficial to support a skilled person so he retains his skills and pays more taxes once he gets a suitable job. This especially true in most of the developed world where higher education is also payed for by the public.

      --
      US-UK-Israel: The real Axis of Evil
    24. Re:Find a new job. by JavaLord · · Score: 1

      Assuming you're serious (seriously ignorant)

      Of course, because anyone who disagrees with you must be seriously ignorant, right?

      there are untold numbers of programmers in the USA who had to accept low paying unskilled positions,

      Being that I am a programmer, and I do work in the US, I can tell you that while the IT market isn't as robust as it was in 1998, a computer science degree will do plenty for you. I don't know anyone who worked as a programmer and found themselves flipping burgers in their next job.

      in order not to starve to death.

      Nobody starves to death here if they don't want to. People who are on welfare get free public housing (projects), and all kinds of social benefits.

      I think your misconceptions about the US are from not having lived here, and perhaps reading too much propaganda.

    25. Re:Find a new job. by JavaLord · · Score: 1

      Completely serious, it's more beneficial to society to allow a skilled engineer to spend several months or more looking for a suitable job than have him deskill himself serving hamburgers, installing cables or doing tech support

      There is a pretty big gap between flipping burgers and doing tech support, no matter how much people joke about it on Slashdot.

      If your country's s Supreme Court believes that it's ok to demolish local businesses to make place for Wallmart because it pays more taxes then it's also more beneficial to support a skilled person so he retains his skills and pays more taxes once he gets a suitable job.

      You can start worrying about US tax revenues when whatever shithole country you are from passes the US in GDP. Also unemployment payments in the US typically cover workers when they are inbetween jobs.

      US-UK-Israel: the real axis of Evil

      Blame the US and the UK for your problems all you want, they basically created western civilization. If that didn't happen, instead of spouting off your half baked socialist values on Slashdot, you would be clubbing people for rights to the nearest puddle so you could get a drink of water.

    26. Re:Find a new job. by Reservoir+Penguin · · Score: 1

      This guy from California is starving to death and cant even create an account "Starving Software Engineer" because it's too long for Slashdot http://slashdot.org/~StarvingSE Oh, the injustices of America!

      --
      US-UK-Israel: The real Axis of Evil
  4. there's usually a quest involved by bunions · · Score: 5, Funny

    Typically, you have to rescue a kings daughter or defeat a marauding ogre that has been terrorizing the townsfolk. That's how I got to be a level 9 Programmer, although the +2 keyboard, +3 against fire elementals, does help. If I take it to the next level, I get an enchanted chair.

    --
    there is no need to sign your posts. this isn't usenet. your username is right there above your post. stop it.
    1. Re:there's usually a quest involved by Alsee · · Score: 1

      If I take it to the next level, I get an enchanted chair.

      He can go defeat a marauding ogre to get *his* enchanted chair, but for those amature-enchanter geeks looking for a good homebrew project I found a walkthrough website that ranks right up there with the best Do-It-Yourself home hardware projects featured on Slashot! Woohoo!

      Enchant it yourself!

      P.S.
      They also feature PC Case Mod projects, an Atari 2600 joystick hardware hack to add tactile response capabilities, and many more!

      -

      --
      - - You can't take something off the Internet! That's like trying to take pee out of a swimming pool.
    2. Re:there's usually a quest involved by wild_berry · · Score: 1

      Watch out for the shady salespeople from Redmond. Don't buy unless it's a flying enchanted chair...

    3. Re:there's usually a quest involved by Macthorpe · · Score: 1

      I take it to the next level by flying, because flying is a martial art!

      I usually then follow up with a totally sweet barrage of fireballs.

      --
      "It does not do to leave a live dragon out of your calculations, if you live near him." - Tolkien
    4. Re:there's usually a quest involved by 19061969 · · Score: 2, Funny

      Maybe the poster needs rescueing? It sounds like he/she is imprisonsed in a cubicle of doom and guarded by a boss with +5 pointy hair.

      --
      bang goes my karma... again...
    5. Re:there's usually a quest involved by Baron+Eekman · · Score: 1

      Perhaps he should consider going down a level

    6. Re:there's usually a quest involved by Xyrus · · Score: 5, Funny

      "That's how I got to be a level 9 Programmer, although the +2 keyboard, +3 against fire elementals does help."

      Amatuer.

      A more efficient way is to find the Wizard of 7-11. You will find many goods for your journey at his shop, such as the Chilidog of Power(+5 artery clogger), the Mentos Charm Disks(+2 charisma), and the Sack of Magical Poofy Cheese (+3 yellow). You must remember to pick up several Flasks of Mountain Dew, as this will give you a +5 haste.

      Soon after consuming the Chilidog of Power and the Sack of Magical Poofy Cheese, you will be endowed with new abilities, most notably the Chair Earthquake (good vs. earth elementals such as the troll-like Cowerkers) and the Cloud of Stench (+10 repulsion). Combined, these will make you a powerful adversary.

      Now drink several flasks of Mountain Dew. Your skills will multiply at an accelerated rate. When your Boss Templar comes around, quickly apply a Mentos Charm Disk for a charisma boost.

      IMPORTANT! DO NOT COMBINE THE MENTOS CHARM DISKS WITH THE FLASK OF MOUNTAIN DEW! This combination will cause much harm to even the strongest of warriors.

      One last word of wisdom. Avoid reading the Scrolls of Slashdot. Only trolls dwell there. No good will come of it.

      Sincerely,
      ~X~ Level 41 Code Warrior

      --
      ~X~
    7. Re:there's usually a quest involved by naibas · · Score: 1

      I recommend games. Problems include building custom memory managers, file managers, scripting languages, graphics systems, physics engines, and tool sets, just to name a few. If you get in with a company that is either sill building up their technology base, or in the middle of a big re-hash, your comp sci degree is going to be pushed to the limits. Even regular day to day stuff will require making smart decisions to tough problems.

      For example, I didn't know much about dynamic programming until I had to implement text diffing for a tool that was part of an internal compare program for our custom data file format. I got paid to read up on the topic and then immediately apply my new knowledge.

      Plus, you are making games, so chances are it's cool to take a break in the middle of the day and play a game, and you won't get into trouble!

    8. Re:there's usually a quest involved by ardor · · Score: 1

      But what if the Boss has the CTO Cloak Of Invulnerability?
      The only thing I can think of is to cast Summon Chick to distract him...

      Now excuse me, I have only 7 HPs and desperately need a +5 Banana Of Healing.

      --
      This sig does not contain any SCO code.
  5. "working on and off as a programmer" by Anonymous+Crowhead · · Score: 3, Insightful

    To me, it sounds like you are not really that interested.

  6. ASM by itwerx · · Score: 2, Interesting

    Learn assembly language and write a simple app like rudimentary text editor or line-art drawing tool, something that requires most of the basic IO functions. (Then try an application launching menu - yay memory management! :)

          This will give you a foundation that will apply to every other language in the world and damn-fine debugging skills as well.

    1. Re:ASM by Ksempac · · Score: 1

      We all know writting code in assembly language is really tricky. However, since most of the jobs as programmers deal with high-level languages, learning assembly may not be a good idea. If you re doing things that are near the hardware level such as programming a robot which needs to respond fast with limited ressources, ok being a good ASM programmer will help you. But if you re doing a high level Object-Oriented Program in C++/Java, you re not thinking in the same way as in ASM and therefore trying to be good in ASM wont be useful.

    2. Re:ASM by www.sorehands.com · · Score: 2, Interesting

      Spending time doing assembler is good. Though you may not be programming it for a job, it improves the depth of understanding of the higher level languages and how the machine works. By understanding how the compiler converts the code, you can optimize your code to allow compilers to work more efficiently -- ie. i=2; if (x) i=5; Here, you only have one branch, not two and there is minimal cost to set a value.

      Knowing assembler language does help in debugging, especially when there is compiler bugs.

    3. Re:ASM by Anonymous Coward · · Score: 0

      That kind of micro-optimization is something modern compilers are pretty good at. It's the more complex transformations that they may miss, and where knowing how a compiler works can really help. But as you said, knowing assembly helps, even if you only use it to check the instruction-level output of your compiler..

    4. Re:ASM by lindquist · · Score: 1

      I second this. Learning ASM was a major enlightenment for my programming

    5. Re:ASM by 16384 · · Score: 1

      This is also my recomendation. If you don't already know assembly, learn it. It does not really matter which processor or architecture, because you will not use assembly afterwards anyway, but you will be a better programmer just by knowing it. If you do not want to learn x86 assembly, something simple like the z80 will be enough, and there are certainly lots of tools and tutorials to help you.

    6. Re:ASM by www.sorehands.com · · Score: 1

      Back in my days at Sytron, I built a DLL mechanism under DOS. Since the MS Compiler (5.1) at the time did not support Tiny model, I ended up using Watcom for the loadable module and MSC for the main program. Of course I had to understand how both compilers work so that I could handle the stack frame differences between the two compilers. I was really impressed with the quality of the Watcom output.

    7. Re:ASM by walt-sjc · · Score: 1

      Yep. It's interesting to compare the different processors. I started on the 6502, played with z80, then 68000, 8088 and IBM360. After learning the 68000 and how elegant the instruction set is, I have a MUCH greater appreciation for just how bad the x86 instruction set is. I feel sorry for anyone that has to do x86 assembly programming for a living.

    8. Re:ASM by commanderfoxtrot · · Score: 2, Insightful

      Learning assembly language is similar to learning Latin.

      You'll learn French, Spanish, Portugese and Italian much much faster if you know Latin.

      --
      http://blog.grcm.net/
    9. Re:ASM by Abcd1234 · · Score: 1

      Umm... no offense intended, but if learning assembler provides "major enlightenment", then I question your education. No, seriously. I've got assembler experience in a few instruction sets (Z80, 68k, ARM, and a bit of x86), and about the only useful thing you'll get out of that is a better understanding of pointers. And if you don't already have that, then the "next level" you'll be reaching is that of an entry level programmer.

      If you want real enlightenment, learn Smalltalk or Lisp. Those languages provide you with tools (such as lexical closures and higher-order functions) that will change the way you look at solving programming problems. The only problem is that, once you learn how to effectively use those tools, you'll never want to go back to languages like Java or C#, which don't have them.

    10. Re:ASM by Anonymous Coward · · Score: 1, Insightful

      By understanding how the compiler converts the code, you can optimize your code to allow compilers to work more efficiently -- ie. i=2; if (x) i=5;

      Understanding how a compiler optimizers code is a very different thing than just understanding assembly language.

      In some sense, you need some level of assembly language to compare the efficiency of the code generated; but it's still a non-trivial task to read the source code of a compiler, and determine, for a given set of generated code, which will perform the most efficiently in the long run.

      It depends on the compiler, *and* on the architecture. If assignment (writes) are more expensive than comparison (reads)(say, on a device that uses flash RAM ), you've just prematurely optimized for the wrong thing. What's more, if it's obvious to you how to arrange the code, it probably was obvious to the compiler writer, too. He has, (at least hopefully), spent more time considering the problem of how to optimize the output of his compiler than you have.

      In other words, if it's always obviously faster better to write: "i=2; if (x) { i = 5 };" than "if (x) { i=2; } else { i=5 }", a good optimizing compiler will convert expression 2 into expression 1 before compiling, anyway.

      And if you have enough free time to read, understand, and re-write the assembly language generated by your optomizing compiler to fix the compiler bugs, you've probably enough time to re-write your high-level program to avoid the bug. Developing bug-free compilers, especially bug-free optimizing compilers, is hard, slow, painstaking work.

      In short, learn a bit of assembly, if you want. But don't overestimate the good it will do. Unless you're working specifically in embedded systems or compiler development, it's all just academic, anyway. You'll never have time to use it under high level language development timelines.

    11. Re:ASM by itwerx · · Score: 1

      THANK you for "getting it", that whole compiler bug thread should be modded off-topic. :)

    12. Re:ASM by itwerx · · Score: 1

      If you want real enlightenment, learn Smalltalk or Lisp.

      That's the last step.
            Without the foundation of Assembly and at least a couple of other "ordinary" languages, (like Java or C#), it's hard to fully grasp the significance of something like Smalltalk or Lisp.

    13. Re:ASM by Fulcrum+of+Evil · · Score: 1
      Understanding assembler is a really good idea:
      • You gain insight on how the processor works
      • This helps if the program breaks messily
      • Even better if the program dies with a stack crash/branch to fishkill/no symbols
      • you can patch games to not check for CDs if that's your fancy
      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
  7. Perhaps you should learn how to program? by shoolz · · Score: 4, Insightful

    I have a feeling that I'm going to be modded troll, but if you know how to program properly you can teach yourself any language without much difficulty and therefore tackle any challenge you place before yourself. Give yourself and insanely unrealistic task and then force yourself to follow through on it. If you can mentally build a road-map to making it happen, you're ok, if not, you may wish to try a new career or remedial programming courses.

    1. Re:Perhaps you should learn how to program? by W.+Justice+Black · · Score: 4, Interesting

      Re: Insane Programming Task

      This is a good idea, believe it or not. Many years ago, I had a case of hubris where I thought I could write an OS in pure assembly. I took a week off of work to give a go at jumpstarting the process. The OS I produced: Er, none. What I learned?

      • How DLLs, particularly linking/loading at compile- and run-time, work at a low level.
      • The innards of three filesystems.
      • Solutions to various bit manipulation problems in assembly.
      • General implementation of hardware-assisted task switching (i.e. saving/restoring registers, etc.)
      • ...and dozens of other esoteric (but later quite useful) topics I can't remember off the top of my head...

      Being a good programmer means challenging yourself--via coding competition (TopCoder, e.g.), weird language acquisition (Haskell seems to be a favorite nowadays), or outrageous tasks (as I did above).

      Picking a favorite OSS program and putting in extra bits is a good thing, too. I did that (though wasn't able to contribute back due to bureaucratic nonsense at my company) with PXELinux and the Linux loop.c driver, for example. Bummer that I could never release the changes, but at least I refreshed my x86 assembly (PXELinux) and learned some kernel driver basics (loop.c).

      Just make sure your company doesn't own your work produced on both on- and off-company time. Ugh.

      --
      "Time flies like an arrow; fruit flies like a banana." --Groucho Marx
    2. Re:Perhaps you should learn how to program? by teslar · · Score: 1
      Give yourself and insanely unrealistic task and then force yourself to follow through on it.
      Amen. Reminds me of that list of "nightmare exam questions" too... can't be bothered to look for it, but the Computer Science exam went something like this:

      Question 1:
      Develop a Fith Generation Programming Language. Use this language to answer all other questions in this exam.

      And for the record, the first insane task I set myself, if I remember correctly, was to write a system for adding a proper pulldown menu system for the games I wrote in Logo (yes, I was young, but I only knew Logo and Basic and commanding the turtle around was more fun). I had animated menus and some rudimentary fading at the end... even if it wasn't the fastest system in the world ;)
    3. Re:Perhaps you should learn how to program? by SkunkPussy · · Score: 1

      Just make sure your company doesn't own your work produced on both on- and off-company time. Ugh.

      That is both abhorent and morally wrong. Unlucky to get caught out by a contract term like that - I hope you got paid a lot of money for it!

      --
      SURELY NOT!!!!!
    4. Re:Perhaps you should learn how to program? by roughshod_coder · · Score: 1

      I think I have a little different outlook on this answer. Relearning what you have already learned while getting your degree through remedial courses may cause this person to lose more interest, and, I do not subscribe to just picking up an open source project and learning it.

      Instead, I believe investing more time learning different architectures or frameworks, and understanding how they benefit computer science or business. Examples being: Service Oriented Arch, Aspect Oriented Programming, Web framworks (Rails, Struts,...), gaming frameworks, et al. Having a thorough knowledge of these lets you concentrate more on building systems and not just mundane programming tasks. In my opinion, the people who know how to build systems are just as talented as the ones who can implement the complex algorithms. This also allows you to compare and contrast how these archs/frameworks are implemented in different languages and will make you more marketable when you go for that next job (which I also think you need to do) and may shed a different light on what you consider programming is.

    5. Re:Perhaps you should learn how to program? by TheRealBurKaZoiD · · Score: 1

      if you know how to program properly you can teach yourself any language without much difficulty

      I agree, and I'll go a step further. I cut my teeth on C & C++, and that is all what I exclusively used for a few years. Believe it or not, it was very difficult for me to pick up VB6. But, at some point it just clicked, and I can pretty much work in one of any of a dozen or so languages I know "very strongly" (some fluently) without having to "translate" between one and another. How did I do this? I started researching the internals of each language, rather than thinking there is a line-by-line correlation and conversion between them. Looking back now, the programs I have written in various languages over the course of the last ten years are all so similar and redundant, but I'm looking at how the program is written, not at the language itself.

      I don't enjoy programming as much as I used to, although I still love it. As I get a little older I find more and more it's the internals of languages and systems that draw my attention and appreciation. And, I get a much broader and deeper sense of satisfaction in architecting large systems now, rather than writing each and every line of code for them.

      Looking back from where I am now, all I see when I look at the applications I've written and databases I've created are discrete mathematics, statistics, and data structures. The programming itself no longer has the meaning for me like it once did, but I don't consider it a loss; I consider I've matured and moved on to bigger and better things.

    6. Re:Perhaps you should learn how to program? by 6031769 · · Score: 1

      When making improvements/modifications to open source code which you won't have rights to and won't be allowed to release, always make sure that you include your name and semi-permanent email address in the comments so that when the day comes that they need to change it again, you (having moved on) can offer to do the necessary for an outrageous fee and/or the mods being released to the public.

      --
      Burns: We're building a casino!
      McAllister: Arrr. Give me 5 minutes.
    7. Re:Perhaps you should learn how to program? by Fahrenheit+450 · · Score: 1

      I have a feeling that I'm going to be modded troll, but if you know how to program properly you can teach yourself any language without much difficulty

      Not troll, though slightly naive (or at least overly optimistic) seems appropriate. While there is a common core that sort of transcends languages, there is a big enough gulf between certain languages that crossing over will likely take some difficulty. For example, I don't see much in C/C++ that will really help you easily pick up monads and arrows in Haskell, or the logic programming of Prolog, or the subtleties of functors, polymorphic variants, and private row types in OCaml's type system. And then you've got the concatenative languages like Joy and Forth which offer yet another disconnect. And of course there are languages like Erlang, Occam, and Pict to play around with too...

      Of course the more you know, the more likely you may be to draw parallels and infer relationships, but some things might still require a good amount of work.

      --
      -30-
  8. Expand by illuminatedwax · · Score: 5, Informative
    Several suggestions:

    • Learn different programming languages. Perl, C++, Python, Ruby, and make sure to include functional ones like Lisp, Haskell, and ML. Build something useful or interesting in each of them.
    • Study algorithms. Get an algorithms textbook and learn about trees, linked lists, hashes, etc.
    • Study complexity theory. Learn how to find the big-O running time of an algorithm. Learn how to reduce an NP-complete problem so you can tell if the problem you are working on is intractible.
    • Study math. Learn cryptography, etc.
    • Read Knuth's Art of Computer Programming.
    • Complete all the tasks you can from the 2006 ICFP Contest.
    --
    Did you ever notice that *nix doesn't even cover Linux?
    1. Re:Expand by dotgpb · · Score: 1

      Read The Pragmatic Programmer and implement as many of the ideas as possible.

    2. Re:Expand by AKAImBatman · · Score: 5, Informative
      Learn different programming languages. Study algorithms. Study complexity theory. Study math. Learn cryptography, etc. Read Knuth's Art of Computer Programming.

      Funny. That sounds an awful lot like a CompSci degree.

      .

      .

      .

      .

      Just saying.
    3. Re:Expand by illuminatedwax · · Score: 2

      I think we've learned something here today :)

      --
      Did you ever notice that *nix doesn't even cover Linux?
    4. Re:Expand by illuminatedwax · · Score: 1

      Almost forgot - SICP is indispensable. Read it and do the exercises (also teaches you Scheme!).

      --
      Did you ever notice that *nix doesn't even cover Linux?
    5. Re:Expand by kfg · · Score: 1

      Funny. That sounds an awful lot like a CompSci degree.

      Hey, at least he's responding on that level. Now I'm no huge fan of what passes for computer science these days, but most of the people here seem to be offering suggestions to some kid who's "learned" Java off the web.

      Now I actually have no idea what this guy actually knows; what he's actually been doing; or where he actually thinks he wants to go, so I'll offer the best completely generic advice I can muster up at the moment:

      To go up to the next level; go down one level below where you've been before.

      Ultimately to reach the top level, see just how far down the rabbit hole goes. I can't, however, guarantee that this will leave you employable, so you might just want to take the blue pill. I think the kids are calling it "C#" these days.

      KFG

    6. Re:Expand by CortoMaltese · · Score: 2, Informative
      Read Knuth's Art of Computer Programming.
      The benefits of reading this is twofold: 1) you can say that you've actually read it, and 2) you can refer to it in any programming related argument: "Look it up in Knuth!"

      Seriously speaking, the books I've found useful (more so than Knuth, anyway) in improving my programming or software engineering skills (in no special order):

      You'll notice that programming is not just about programming. Seeing beyond one programmer, one team, one language, one operating system, one tool, one method, one project, etc. gets you to another level.

    7. Re:Expand by RAMMS+EIN · · Score: 4, Insightful

      ``Funny. That sounds an awful lot like a CompSci degree.''

      I _wish_ CS degrees actually taught people different programming languages these days. And I don't mean mentioning them in passing and showing a few snippets of code, but _actually_ making people use the concepts of these languages and recognizing the value of these concepts.

      --
      Please correct me if I got my facts wrong.
    8. Re:Expand by Slithe · · Score: 1

      From my limited experience with CompSci degrees (I am a Physics major), Computer Science is basically Applied Mathematics. A knowledge of algorithms, proofs, and a good helping of experience to understand the 'programmers mindset' are far more important than learning different languages. Nearly any problem can be solved with a Turing Complete language, so it hardly matters which one it is. In addition, most programmers will use the popular languages (like Java) in their jobs, so learning less popular languages (like Lisp and SmallTalk) will not be very helpful.

      --
      ---- "XML is like violence. If it doesn't fix the problem, you aren't using enough."
    9. Re:Expand by Peter+La+Casse · · Score: 1

      Mod parent up. When I was in a similar place to the submitter, I started by reading the usual recommended programming books and doing small projects to learn new languages, but what had a more positive impact was starting a CS or SE Master's program. Some courses are boring but others are amazing; I'm taking a course now that has weekly programming assignments, and I'm seeing benefits from putting new ideas into practice over and over again. The fast pace is stretching me and forcing me to improve; I know that if I were going through the book on my own, I wouldn't be doing an assignment a week. Being in an official program is, for me, like hiring a personal trainer to kick me in the butt and force me to keep the pace.

    10. Re:Expand by AKAImBatman · · Score: 1
      When I was in a similar place to the submitter, I started by reading the usual recommended programming books and doing small projects to learn new languages, but what had a more positive impact was starting a CS or SE Master's program

      I think you're missing the point of my post. The submitter claims to already have a CompSci degree. Which means that the items listed should be redundant. If they aren't (which they probably aren't), it says a lot about what he got out of his education. Whether that is his fault or the school's is a matter for debate.

      The conclusion one might come to is that there is just as much (if not more) value in simply learning the topic on your own. Doing this allows you to work at your own pace, provides you with motivation to learn, and allows you to cover topics that a poor school might fail to teach properly.

      Never stop learning. Words to live by. ;)
    11. Re:Expand by RAMMS+EIN · · Score: 1

      ``From my limited experience with CompSci degrees (I am a Physics major), Computer Science is basically Applied Mathematics.''

      I suppose you could say that, but I prefer to see computer science as a discipline on its own, which happens to involve some mathematics (as so many disciplines do). The overlap between mathematics and computer science is actually very limited: there are lots of things that are considered part of mathematics, and only a few of these are relevant to CS; conversely, there is a lot to CS that is irrelevant to mathematics in general or even other domains one could consider applied mathematics.

      ``A knowledge of algorithms, proofs, and a good helping of experience to understand the 'programmers mindset' are far more important than learning different languages.''

      That is certainly true of one's objective is to get a CS degree, but that's not what this thread is about. The thread is about improving programming skills, and, for that purpose, I would consider learning various languages an absolute necessity, and perhaps even more important than anything you learn in a CS program.

      ``Nearly any problem can be solved with a Turing Complete language, so it hardly matters which one it is.''

      That's simply not true. Turing completeness is a valuable concept in theoretical discussions, but it's practical value is very limited. SK calculus is Turing complete, but writing almost any algorithm in it is a nightmare, not to mention that it doesn't support I/O, which makes it almost completely useless for writing programs.

      Even among more realistic languages, different choices have different implications. Programs written in OCaml will almost certainly run faster than programs written in Python. Python programs will almost certainly be shorter than Java programs that do the same thing. Various abstractions that can be expressed in Common Lisp cannot be expressed in C. A program that is accepted by the Eiffel compiler is more likely to do what you want it to do than a program accepted by a Forth compiler. Etc.

      ``In addition, most programmers will use the popular languages (like Java) in their jobs, so learning less popular languages (like Lisp and SmallTalk) will not be very helpful.''

      Not for the purpose of finding a job, but for the purpose of solving problems, it will. Learning different kinds of languages teaches you different ways to look at problems. The languages most asked for in current job ads are very similar: imperative, object-oriented, and pretty verbose. If you learned just these languages, you would almost certainly miss out on functional programming, declarative programming, concurrent programming, metaprogramming, and a whole load of other techniques, because these are not comfortably expressed in these languages. However, knowing these techniques can sometimes help you to find more elegant solutions even in languages that aren't made for these techniques. For example, see how Brandon Corfman wrote better C++ by looking at Common Lisp.

      --
      Please correct me if I got my facts wrong.
    12. Re:Expand by Anonymous Coward · · Score: 0

      Agreed. IMHO, I started to write better object-oriented code in C++ and Java after I learned Smalltalk. Btw, I recommend Kent Beck's Smalltalk Best Practive Patterns.

    13. Re:Expand by 1iar_parad0x · · Score: 1

      Recently, I ran across Marvin Minsky's 'Society of Mind' in a psychology section of the library. At first, I thought it was just a poorly placed book, but then I realized most of the content of the book had very little in common with the AI books I've seen used by CS departments. Most AI courses are highly synthesized garbage. They don't really teach probability/statistics (they've got a department for that), they don't really teach logic (they got 2 departments for that), they don't teach you about linguistics, physiology, .... Well, you get the idea. Knuth's book is fairly similar. Most algorithm books don't bother to implement their own instruction set. Aside from being a more 'mathematically elegant' book, Knuth realizes architecture and language design play a role in writing fast code as well. If I wanted to be a great computer scientist, I'd study Math, EE, and Cognitive Science and take a Algorithms class for fun. IIRC, Minsky and Knuth both have Math PhDs.

      --
      What do you mean my sig is repetitive? What do you mean my sig is repetitive? What do you mean....
    14. Re:Expand by georgemoot · · Score: 1

      "I _wish_ CS degrees actually taught people different programming languages these days"

      Personally, I'm glad they don't. I see nothing wrong with an Intro to C/C++/Java class way at the beginning, but that's about as far as it should go. Once you have the foundation to understand how languages work, classes should focus on higher-level concepts which apply to nearly all programming languages, rather than showing you how to do specific things in a specific language.

      Once you know one procedural/object oriented language, you basically know them all. They all have closely overlapping abilities, with the only large hurdle being syntax, which can be overcome by having a language reference handy the first few days of coding. I can understand a seperate class to delve into the complexities of, say, functional programming (LISP) and another for logic programming (ProLog), and maybe even low-level Assembly coding, but again, with those, once you get the "style" down, you are set. Do you really need a seperate C, Java, .NET, PHP, etc class?

      Personally, I don't care what color of ink is in my pen, it only matters that I know how to write.

    15. Re:Expand by Peter+La+Casse · · Score: 1
      When I was in a similar place to the submitter, I started by reading the usual recommended programming books and doing small projects to learn new languages, but what had a more positive impact was starting a CS or SE Master's program

      I think you're missing the point of my post. The submitter claims to already have a CompSci degree. Which means that the items listed should be redundant.

      I don't think it means that. An undergraduate degree introduces the items listed, but it can't teach everything about them.

      I think you're missing the point of my post, which is that a structured program can be beneficial even for somebody who's been working for a few years, reading the right books and writing hobby programs to learn new languages and stretch their boundaries. Let me append to that "especially if they already have a CS undergraduate degree," because then they probably have the breadth requirements covered.

      The conclusion one might come to is that there is just as much (if not more) value in simply learning the topic on your own.

      One might come to that conclusion, unless one has already been doing all the right things and remains unsatisfied. If one is desperate enough to ask slashdot how to improve oneself, one should evaluate the available local graduate programs (if any).

    16. Re:Expand by illuminatedwax · · Score: 1

      yeah, i missed that oops :) he may have just gotten a poor education, taken the wrong courses (how many undergrad students learn how to reduce an NP-complete problem anyway? and you need to know a good deal to read knuth fully) and it's wise words in general. imho

      --
      Did you ever notice that *nix doesn't even cover Linux?
    17. Re:Expand by Anonymous Coward · · Score: 0

      I hate to tell you this, but the computer science degree that I am currently in requires all kinds of different languages and applying the different strengths of them. Such as the mips assembly language that we are working with, it requires all kinds of memory management (Especially with the assembler/simulator that I had to produce.) Then with C we used all sorts of pointer (makes life so much easier than java) and it required us to use all kinds of memory management again.

      Not to mention that we also had to work with scheme, and prolog as well. When you want to talk about different degrees of programming try having to learn both scheme and C in the same class. Scheme - no variables, and no loops, all recursion.

      So, yes, computer science degrees actually do require you learn many different languages. I haven't even begun to scratch the surface of all the languages I have had to learn in my degree.

    18. Re:Expand by Kuxman · · Score: 0

      I don't know what it's like at other universities, but here at Carnegie Mellon, CS students must master Java, C++, some Lisp, assembly, SML/NJ. On top of all that, many students dig into other languages (ada, pascal, etc.). It's a very thorough education, with lots of attention on both the theoretical as well as the practical sides of CS.

      --
      http://www.asti-usa.com
    19. Re:Expand by Anonymous Coward · · Score: 0

      CM is one of the top CS schools in the country for a reason.

    20. Re:Expand by Anonymous Coward · · Score: 0

      I have to agree, I'm at ASU and we have to master all those but with scheme instead of lisp, but maybe that is why we are just barely in the top 25 and not at the top of the list like you guys at CMU. Either way, lots of theoretical computer science, and many different algorithm classes.

    21. Re:Expand by Tellarin · · Score: 1

      I don't know about you, but during my CS degree I had to use and deliver course projects mostly in C, Haskell, Java, Prolog and x86 Assembly. But I also had to work with Smalltalk, Florid, LIFE, Scheme, LISP, C++ and VHDL.

    22. Re:Expand by Anonymous Coward · · Score: 0

      A good CS course doen't involve programming at all

      If we prove our algorythms are free of bugs, why on earth would we need to actually code them up ?

    23. Re:Expand by Fulcrum+of+Evil · · Score: 1

      The good ones do: I went to RPI, and most stuff was C++, but you also had stuff that required perl or java or lisp, and it was assumed that you could pick up the language on the side. I still want to learn lisp well, but that's fairly tough going.

      --
      "We returned the General to El Salvador, or maybe Guatemala, it's difficult to tell from 10,000 feet"
    24. Re:Expand by Anonymous Coward · · Score: 0

      As someone with a MSc in applied mathematics I can say that nothing a saw in any of the Comp Sci classes I took (including algoritms and complexity analysis) really deserved to be called math. It was at best a vauge, watered down, hand waving facsimile of math. Sure they used math notation, and some concepts and methodolgy borrowed from math, but that doesn't make it math. I really wish people would stop calling Comp Sci math, it annoys us who actually know math.

  9. Hate to sound like a broken record by LeonardsLiver · · Score: 5, Insightful

    but have you considered helping on a open source project? Depending on the project (and yourself) you could learn a lot. It being a real project with a real team, etc, should sufficiently motivate you.

    As for books, pick up K&R & read it, work the execrises, repeat.

    Best of luck.

    1. Re:Hate to sound like a broken record by grayrest · · Score: 1

      I'd like to second this. I worked on the Mozilla project while I was in school and credit them for most of the software engineering that I know. It's one thing to do stuff in school, it's another to work on a really big project with programmers who know vastly more than you do.

      It also taught me to appreciate serious application-style javascript, which happens to be useful these days.

  10. Work with other people by jkakar · · Score: 1

    Find a project you're interested in, see what needs doing and get involved. Contribute patches, propose ideas, ask for feedback from more experienced people. You can practice a number of important skills this way both technical and social. A big part of working with others is that you get to start understanding how other people think--that will both grow your understand and help you understand where your natural boundaries are. You need both those things to grow.

  11. The challenge lies within yourself by Anonymous Coward · · Score: 0

    Cheesy, but true. Nobody is going to just push you into a position where you have to stretch yourself, unless you are very lucky (and so far, apparently, you haven't been).

    Choose a project. Maybe only for you; maybe it only makes sense to you.

    Evaluate different non-mainstream languages for the project. (Good places to start, IMHO: assembler, erlang and FORTH).

    Decide on programming standards. Give yourself reasons for them! Good reasons include maintainability, expandability, explicability.

    Execute.

    Debug!

    Now choose another challenge, do the same thing, but choose one on the brink of feasibility. Make it feasible, using knowledge of mathematics, computer science and so on.

    Do it on old, slow, busy hardware. Make it pleasantly fast to work with. Make it not require much (anything!) from the environment. And so on ... limit yourself, and learn to grow around limits.

  12. Books? by prash_n_rao · · Score: 2, Interesting

    I would recommend volunteering for a GPLed project in a domain that you want to improve your skills in. The real-world issues you'll face will surely improve your skills in domains thet you are interested in. The books/material you would have to read will get driven by this project's needs.

    --
    This is not my sig.
    1. Re:Books? by Propaganda13 · · Score: 1

      While studying is all fine and good, you really need to code. The GPLed project is good for few reasons.

      1. It forces you to read other people's code and possibly interact with other coders. Depending on the project, your input might be restricted by other parts of the project or you'll spend time revising someone else's code. Common things in the workplace.

      2. Hopefully, you're adding value to a good GPLed project instead of a half-finished project that no one else will see. There's already plenty of those.

      3. If you really don't like where the project is going, you can always fork it. :)

  13. If you want plenty of practice by toadlife · · Score: 1, Troll

    Write a driver for Linux - preferably a useful driver that 14-17 year old demographic (Which pretty much covers every Linux user) will want to use. With every point kernel release, you'll be forced to update your driver, sometimes having to completely rewrite it to keep up with trivial (and seemingly useless) binary kernel interface changes, and at all times wondering if there even is a binary kernel interface.

    Motivation to update your driver won't be a problem because every time a new kernel is released and your driver breaks, you'll get hundreds of reminders (death threats) from Gentoo users who just ran emerge '--universe -09* --funroll-loops' on their Mom's old E-Machines box, that you need to fix your driver.

    --
    I don't always use unix-like operating systems; but when I do, I prefer FreeBSD.
    1. Re:If you want plenty of practice by WoLpH · · Score: 1

      I detect a little bit of frustration in your post, what driver have you written? For me it was a webcam driver and yes, I did have to update it _every_ point release, right now I've just stopped updating the kernel and just give it security patches, seems easyer for me.

    2. Re:If you want plenty of practice by Anonymous Coward · · Score: 0

      Don't know 'bout you, but Funroll Loops sound really tasty right about now.

    3. Re:If you want plenty of practice by vga_init · · Score: 1

      That's funny. =)

    4. Re:If you want plenty of practice by toadlife · · Score: 1

      Actually, it was just a little joke/troll. By the way it was modded, and your reply, it looks like I hit the bullseye.

      Just my half-hearted attempt at observational comedy.

      --
      I don't always use unix-like operating systems; but when I do, I prefer FreeBSD.
    5. Re:If you want plenty of practice by Anonymous Coward · · Score: 0

      that 14-17 year old demographic (Which pretty much covers every Linux user)

      Hi Bill! Not seen you round these parts for a while. Sorry to hear
      about your problems with Vista, I'm sure things will work out.

  14. Similar Past by cmeans · · Score: 2, Interesting

    I had a job at a large corporation...not too much programming, but (eventually) lots of networking, support etc..

    I streached my wings and found places where I could do some programming to expand our capabilities, still within my job function.

    Eventually (after about 7.5 years at that company, which I started at straight out of college), I quit (lots of other reasons, but I was also just burned-out and not challenged enough). I took about 8 months off, learned C (only got Pascal and a smattering of other languages in college), and developed a variety of windows based utilities etc.. Not so much to sell, but as a learning experience. After that break, I slowly started back into the regular work-force, but aimed myself at a programming job (but now had lots of other experience behind me).

    Now I have a great programming job, working on a variety of projects, and lots of flexibility.

    I never had aspirations to be a game developer, business oriented applications and services are more my speed. Try to decide what area you want to develop in, then aim yourself via classes, books, etc. towards that goal.

  15. Programming self-improvement by Animats · · Score: 4, Informative

    Six years out of school and "programming on and off" seems strange. What kind of programming do you want to do? GUI stuff? Graphics? Games? Algorithms? Databases? Real-time?

    One way to get better as a programmer is to do maintenance programming on code written by someone better than you. Learning to understand someone's thinking by reading their code can be a worthwhile exercise. It's also useful to be able to write in someone else's style.

    Right now, something worth getting good at is understanding how to write highly parallel programs that are reliable. Write something that has lots of intercommunicating threads and be confident the locking is correct. There aren't that many people who consistently get that right. You have a CS degree, so you have the theory for that. Put it into practice. The world is full of underutilized multiprocessors. Learning how to write safe concurrent code will definitely make you a better programmer. (It will also make you realize how bad most mainstream programming languages are for this.)

    On the language front, today I'd say that you should be good at either Java or C++ (C# if you're in Microsoft land), and either Perl or Python (VB if you're in Microsoft land). One strongly typed language that goes fast, and one weakly typed interpreter. Basic familiarity with the HTML/PHP/Javascript world is useful, but don't spend all your time on the details of that - that's for low-level programmers with two years of experience. Also, learn how and when to use a relational database, at least at the MySQL call level.

    1. Re:Programming self-improvement by Osty · · Score: 2, Interesting

      Also, learn how and when to use a relational database, at least at the MySQL call level.

      I would suggest that if you're going to take the time to learn a relational database, pick one that will cover all of the core functionality without introducing its own idiosyncracies. PostgreSQL is free, SQL Server Express is free, and you can get trial versions of Oracle and DB2 for free as well. Once you've learned on a real database (with proper transactions and foreign key support without having to monkey around with different table engines, SQL-language stored procedures, user-defined table and scalar functions, more compliant ANSI-standard language constructs, etc) you should have no problem picking up MySQL if a job or application requires it. However, learning on MySQL will lead to bad habits that will be difficult to break when you move to a proper relational database.

      Just because MySQL is used everywhere doesn't mean it's good. I would think Slashdotters would understand that, given the attitude towards Windows around here ... :)

    2. Re:Programming self-improvement by RAMMS+EIN · · Score: 1

      ``Right now, something worth getting good at is understanding how to write highly parallel programs that are reliable. Write something that has lots of intercommunicating threads and be confident the locking is correct. There aren't that many people who consistently get that right. You have a CS degree, so you have the theory for that. Put it into practice. The world is full of underutilized multiprocessors. Learning how to write safe concurrent code will definitely make you a better programmer. (It will also make you realize how bad most mainstream programming languages are for this.)''

      Absolutely agree. This has been a useful skill for ages, but with the likes of Google and the advent of common consumer hardware with multiple cores, it's becoming more of a critical skill.

      --
      Please correct me if I got my facts wrong.
    3. Re:Programming self-improvement by fbjon · · Score: 2, Insightful
      bad habits that will be difficult to break
      That sounds a bit exaggerated. It's not like moving from MySQL to PostgreSQL is like moving from BASIC to C or Java.
      --
      True confidence comes not from realising you are as good as your peers, but that your peers are as bad as you are.
    4. Re:Programming self-improvement by RAMMS+EIN · · Score: 1

      ``On the language front, today I'd say that you should be good at either Java or C++ (C# if you're in Microsoft land), and either Perl or Python (VB if you're in Microsoft land). One strongly typed language that goes fast, and one weakly typed interpreter.''

      Meh. I see why you would want a fast language and a language that lets you write things concisely, but why not a language that has both features? OCaml, for example.

      In terms of languages that are worth learning for their concepts, you shouldn't stop at just two languages, and certainly the choices you suggest represent a rather small corner of the universe. I would say: assembly for understanding what happens at instruction level, some functional language (e.g. OCaml), an object-oriented language (perhaps Java or Smalltalk), some declarative language (Prolog?), a multi-paradigm language (e.g. Common Lisp or Ruby), a lazy language (Haskell, for example), and some language that focuses on concurrency (Mozart?). I probably missed out on a few interesting and important concepts; my journey isn't complete yet. Note that Common Lisp also includes metaprogramming (having Lisp cod generate Lisp code) and aspect-oriented programming (at least, as far as I understand what that means). The more concepts and paradigms you learn, the more ways you will have to approach problems, and the more elegant your solutions will be.

      Of course, there is also the practical aspect: what languages are actually being used in the workplace? That one is easy: just look at the job ads, and learn the languages they ask for if you feel the need. Once you have picked up a significant number of languages, learning new languages (especially those used in the commercial world) is often just a variation on a theme.

      --
      Please correct me if I got my facts wrong.
    5. Re:Programming self-improvement by Anonymous+Brave+Guy · · Score: 1

      I'm curious about this, partly for the specifics and partly because I'm aware from other areas I know well that geeks picking up a new tool on their own can sometimes get the wrong idea.

      I've recently been developing a few databases for a local non-profit I work with, just things like simple financial record-keeping and the like, and hooking these into the organisation's web site. I've been using MySQL, as much because it was what was installed on our host's system as anything else. However, as far as I've seen so far, it works perfectly well for the sorts of fairly routine SQL query I need, and its tools and configuration also seem flexible enough for anything I need.

      So, what sorts of bad habit am I likely to be picking up? I know the MySQL manual mentions a few "non-standard" features, but I don't think I've had cause to use them yet. Is this just one of those things where you don't notice the differences on small-scale projects?

      --
      If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
    6. Re:Programming self-improvement by Anonymous+Brave+Guy · · Score: 1

      I see why you would want a fast language and a language that lets you write things concisely, but why not a language that has both features? OCaml, for example.

      Because there is such a thing as the right tool for the job, and often it's best to go with a specialised tool that does one thing very well, rather than a hybrid that does most things OK. To use your own example, OCaml can certainly be fast and obviously it supports a functional programming style, but how often do you see an example where it's doing both at the same time? (This isn't a dig at OCaml; I'm just saying that from a personal development perspective, hybrid approaches aren't necessarily the best way to learn.)

      Of course, there is also the practical aspect: what languages are actually being used in the workplace? That one is easy: just look at the job ads, and learn the languages they ask for if you feel the need.

      I'm not sure that's really the way to go. Job boards are a notoriously inaccurate way of gauging which programming languages are actually useful or in demand, not least because people using good languages to solve interesting problems tend not to change jobs very much. If you want a job, sure, read the boards and get some experience with the top couple of languages listed. If you want an interesting job, you might want to look a little deeper. After all, you're going to take at most one of the positions advertised, so any skill that has at least one job advertised that requires it might be the right thing for you.

      --
      If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
    7. Re:Programming self-improvement by Doctor+Memory · · Score: 1
      Job boards are a notoriously inaccurate way of gauging which programming languages are actually useful or in demand


      Well, I can see "useful", but job boards pretty much define what languages are "in demand". After all, isn't that where the demands are made?

      I actually lucked into a "senior support" position, where I have to write interfaces to move data between systems. As long as it works, that's OK with my boss[1], so I have written stuff in C, Java, Ruby, Perl, and...well, there was that one in COBOL, but that wasn't my choice. Anyway, my point is, maybe try to find yourself a job where you can do development, but don't have to play the development game.
      ---
      [1] Fortunately, once these things are in place they either don't change or need to be completely rewritten, so I don't have any concerns about leaving unmaintainable code for someone else.
      --
      Just junk food for thought...
    8. Re:Programming self-improvement by Coryoth · · Score: 1
      Right now, something worth getting good at is understanding how to write highly parallel programs that are reliable. Write something that has lots of intercommunicating threads and be confident the locking is correct. There aren't that many people who consistently get that right.

      Then learn CSP or CCS or a similar process calculus that will let you easily reason about vast numbers of processes and be sure you don't have deadlock or race conditions. You an convert that to code easily enough in a lot of cases: Java has JCSP and I expect similar things probably exist for other languages. Alternately languages like Erlang or Oz or Eiffel with SCOOP support a programming style which is relatively easy to convert back and forth to CSP. Writing massively concurrent code isn't actually that hard if you're actually willing to do the groundwork to learn how to really do it well.
    9. Re:Programming self-improvement by Anonymous+Brave+Guy · · Score: 1

      Well, I can see "useful", but job boards pretty much define what languages are "in demand". After all, isn't that where the demands are made?

      Well, they are where some vague statements of things that might be in demand are made. :-)

      Seriously, though, I've never found job boards to be particularly representative of my experiences from either side of the recruitment process. Again, a lot of the more useful tools are "smaller market" things where the people with the skills and the people who need them meet by other means (networking being the obvious one, but also via technical discussion forums on-line, for example). Also, a lot of the job board ads are written by HR weenies with no clue about what the long words mean: take a look six months after any trendy new technology goes mainstream, and look at the number of ads for people with 5+ years' experience using that tech. Those aren't real demands, and there are no real vacancies that require 5+ years' experience in a technology that's only a year old, but that's what the boards will often tell you.

      In other words, if the boards were realistic and everyone used then, then yes, they'd be a fair indicator of what's in demand. In reality, I don't think either of those things is true to a useful approximation, and the boards lack credibility accordingly.

      --
      If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
    10. Re:Programming self-improvement by Doctor+Memory · · Score: 1
      a lot of the more useful tools are "smaller market" things
      Oh, granted, for actually getting a job, the job boards are not necessarily the best tool. What I have found handy about them is to peruse the offerings that target my skill set, then see who's asking. You can pretty quickly build up a picture of who the players in the market are, and then start dredging the web to find out more about them. If they're a slap-dash body shop, then disgruntled ex-employees aren't shy.

      a lot of the job board ads are written by HR weenies with no clue about what the long words mean
      Which is fine, really, since they're not the ones who (ultimately) need the workers. The development manager knows what they want, and generally specifies the must-have, should-have and nice-to-have. The weenie may add the "N years of experience" BS, but they don't advertise for Java developers if they need someone to write .NET code. So I think they are useful as a guideline, but not gospel.
      --
      Just junk food for thought...
    11. Re:Programming self-improvement by kabz · · Score: 1

      The skill isn't in multi-threading, it's in knowing where to single-thread... ;-)

      --
      -- "It's not stalking if you're married!" My Wife.
  16. Learn a different language. by mabinogi · · Score: 1

    Start doing some personal projects in a different language to the one you're exeperienced in.
    If you use an object oriented language, then learn Smalltalk, you'll definitely learn some stuff that you'll be able to apply to your main language.

    --
    Advanced users are users too!
  17. The classic programming excercise by 6350' · · Score: 1


    Commune with your inner Angband variant.

  18. Go work in a crummy company by rocjoe71 · · Score: 5, Interesting

    ...No seriously. If you join an IT department where you're the "big fish in a small pond" people will start to notice, they'll give you the tough jobs (note: NOT read as "fun" or "challenging") and because the rest of the IT department is crap they'll pile it on and I mean it. If you find the right place (i.e. the worst place) they'll stack it up and then slam you for not getting it all done sooner.

    Instead of sinking under all that work, it will become you're motivation to raise your game and plow on through. You'll find new techniques to get work done, you'll learn to identify the patterns that get work done in the department and you'll invent new processes out of those patterns. When you start to succeed, you'll master your job and maybe a programming language or two.

    Then when you're feeling confident about your skills, QUIT that job and go join a firm with a good reputation, knowing full well you're ready to play with the big boys.

    But seriously, don't go searching for a book or learning material. Search for MOTIVATION. It's through motivation that we test how much weight we can pull and it's motivation that will select the subjects that we want to study the most.

    --
    Height: 38U, Weight: 0 Newtons, Eyes: #0000FF, OS: Gray Matter 1.0 (Alpha)
    1. Re:Go work in a crummy company by Anonymous Coward · · Score: 0

      Funny, somewhat related story about crummy IT dept and motivation.

      I work in IT as a sysadmin. We've been moving servers over from physical to virtual Vmware servers and the time had come to migrate network printers to a new server. My well-meaning-and-hard-working-but-not-so-competent coworker who works on another site most of the time spent nearly a month migrating printers and clients' network printer mappings over to the new print server.

      To migrate the users at the site I work at I wrote a 17 line .vbs script.

    2. Re:Go work in a crummy company by Anonymous Coward · · Score: 1, Interesting

      Yeah, that is top-notch advice.

      I did the same.

      I was a researcher at a university here in Sweden, and my theoretical skills where second-to-none, but when I moved out into the real world I couldn't get a job because "I was too over qualified". Then I finally got a job without them knowing much about my background a skills, a complete crap company where nothing worked... and I mean nothing. Actually, the people there where very good at what they where doing but the PHB:s where really running the company (that they owned) into the ground.

      I had to solve stupid problems that management created, so I got to apply the theoretical knowledge that ACTUALLY worked and figured out what DID NOT. It was tiering, and I really dislike working with computers now, but from a work-oriented perspective it was very good indeed. So follow this guys advice, but jump ship when you feel that you never want to touch or see a computer at home.

    3. Re:Go work in a crummy company by Jellybob · · Score: 1

      Excellent advice - I'm starting out in the design/development world as a web developer for a small agency, and there's nothing as good for learning your trade as being the guy that can get things done.

      Over the past week, I've done a huge variety of things, including working with an incredibly talented developer at our sister company to get a brochure generated from a product database that already existed. Sadly I didn't get home until 2am yesterday, but hey - it's all experience!

  19. Make a Game by Unoti · · Score: 1

    Download the Microsoft XNA framework and build a game!

    1. Re:Make a Game by Anonymous Coward · · Score: 0

      Yeah, Microsoft XNA and get locked into a proprietary platform?

      Better use C/C++ and libsdl or Python and PyGame or something.

  20. how i am learning... by b1ufox · · Score: 2, Interesting
    Most of the programmers face this question in the working phase of their lives, sooner or later. The comparision is inevitable, afterall who doesnot want to be master or better and better in their working area.

    Being a programmer myself and looking for answers, finding most of them on my own and finding other on this thread :), i find some interesting observations.

    To be a good programmer you need practice for sure, but you need stimulating challenges to work on.As in my case i found that to be the Linux kernel.I may not be the best of the kernel hackers but yes i have a passion for kernel.I work on an entirely different area at work, which is C++. But my inqusitiveness and quest to be a good software programmer has led me to realise one thing, you are on your own. Try to learn from your mistakes. More you make them, more you learn.And who knows down the line may be after a couple of years you can be a pretty good programmer.

    Working for a GPLed project is a good idea but you need certain level of expertise for it. And effort you put into your passion for programming will get you to that expertise. Once it is achieved you can choose a GPLed project of your choice and certainly you ll hone your skills for sure. Good luck :)

    --
    -- "Genius is 1% inspiration and 99% perspiration" - TAE --
  21. some tips ... by joe_cot · · Score: 1

    1) Try numerous languages (C++, java, php, python, PERL, lisp, scheme) -- you don't need to become proficient in all of them. Learn their mechanics, their strengths and weaknesses, what fields they're applicable for, etc (ie lisp and scheme are practically de facto AI languages; PERL treats a regular expression like it was a plus sign). The more languages you're familiar with, the more abstractly you can program.

    2) Pick a language you're comfortable with. Learn every wonderful, disgusting detail of what you can do with it (our head programmer knows more about php than its developers do). Preferably, pick one that's managed for now (ie not C++ or C) so you spend more time programming and less time worrying about memory leaks. Yes, unmanaged code is faster, but you're learning about being a _better_ programmer, not writing an operating system.

    3) Give yourself projects that you know are beyond your scope. Pick something you're interested enough in that you'll stick with it if it gets annoying. For example, I taught myself php and sql by writing a Character Manager for a roleplaying game. It's not pretty, it's not the most efficient it could be, but it served its purpose; I wrote it from scratch, and every time I learned something knew, I rewrote half of it. Certain languages (PERL, Scheme) you really have to give yourself a goal in order to stick with. You're never going to learn anything about programming if you're not working on something you care about. Stuck on how to do something? That's the point. Find out how. Look it up on google, or better yet, Google Code Search. Plaigarism schmaigarism. You're learning, and no one's going to use your stuff but you.

    4) When you write a piece of code, think logically through how it works, how long it takes in best case, how long it takes in worst case, etc. If you have time, look into Time Complexity Theory, but in most situations you should be able to tell if it's a god awful way to do the job, even if you can't think of a better way at the moment. Make it as efficient as possible (or at least understand what _is_ the most efficient way, had you the time to implement it), and move on. My first CS teacher took points off because my algorythm iterated one more time than it needed to. That might sound silly, but when it's running 1000 times a second, it counts.

    5) Do the pthread dance. Write a multithreaded program that does what it's supposed to do, every time.

    6) Learn about security, buffer overflows, sql injection, etc. Hack your own software.

    7) Books -- skim lots of them, read very few of them. All that reading books gets you is a lot of knowledge, but many times not a whole lot of application. Read the tips and tricks that stick out. O'Reilly books are great for that sort of thing. One of theirs you should definately skim very strongly is "Mastering Regular Expressions".

    8) Don't be afraid to specialize. If you like web development, do it. If you like a specific language, use it. If you want to write simulators for gravitational wave theory (I have no idea, but it sounds obscure enough to me), go right ahead. Someone will need what you're putting out there, and if they don't, you're probably learning skills that apply just as well for what they /do/ need. If you build your knowledge around being able to program 3d engines, AND being able to do web development, AND being able to do xyz completely different CS field, you'll be good at none of those things.

    8) Don't burn out. If there's another problem you feel like working on more, stop whatever you're doing and work on that instead. Write stuff for Open-Source projects. Find bugs in open-source projects. Read open-source code and try to figure out just what in the hell it's doing. Think about how you could do it better.

    You get the idea.

    1. Re:some tips ... by mrchaotica · · Score: 1
      Preferably, pick one that's managed for now (ie not C++ or C) so you spend more time programming and less time worrying about memory leaks. Yes, unmanaged code is faster, but you're learning about being a _better_ programmer, not writing an operating system.

      Dealing with memory management is more than about the code bing "faster," I think. Having an actual difference between variables on the stack and on the heap leads to better awareness of things like space efficiency and variable scope, which are useful in any language. In addition, it can encourage good programming habits like modularity and awareness of side-effects (e.g. "Is it worth it to deal with malloc, or is it okay to pass this variable up and down the stack?").

      --

      "[Regarding the 'cloud,'] ownership was what made America different than Russia." -- Woz

  22. Set Yourself A Hobby Project by Michael+Snoswell · · Score: 1

    Challenge yourself with something difficult. I don't mean writing a new Compiler or RPG. Something you actually need or would like to have.

    Projects I worked on included writing
    - a small RT OS for it to interface to my computer to perform maths routines faster, all programmed in assembler and later in C.
    - a multiuser 3D based engine (including all the 3D rendering and lighting routines - this was in the early 90s) in C and assembler
    - a python based server monitoring system with awk and perl agents
    - a neural net based artificial life form in C++ (it didn't work but I learnt a lot!)

    There were lots more but these took from a few months to a few years to complete. Each one required going off and researching algorithms and software design and languages. The actual experience gained was used in later jobs and I've used the above items in my resume and it has helped because some employers have seen those and realised that's just what they need (though they never advertised the fact).

    Also, use other people's code as examples or starting points. I learnt a heck of a lot trolling through apache or freeciv or Small-C or so many other things just trying to find some code that did what I wanted or trying to mould a program to my own purposes.

    It is critical to learn how to write well laid out and documented code too and how to craft a good Makefile.

    Now if you're going to do SQL coding for a living or .NET C# then some of this doesn't apply. In general though, I'd say getting experience in working systems in a number of languages is very useful as it teaches you to design a program in general, rather than how to do something specific in a set language. Good programmers are good in any language.

    Make sure the hobby projects are things you'll actually use yourself, so you will learn to maintain code and will get annoyed if it has bugs. Better still, make it something other people use too so they'll tell you about the aweful UI you design or the bugs you'd never find yourself.

    --
    pithy comment
  23. Minor? by EEBaum · · Score: 2, Insightful

    What was your minor in college? Sounds like someone needs a change of scenery.

    --
    -- I prefer the term "karma escort."
  24. Learn Lisp, avoid fads by ghostunit · · Score: 3, Insightful

    I recommend you the following essay (or any by Paul Graham for that matter):

    http://www.paulgraham.com/avg.html

    If you have a boring programming job such as coding Java web apps (as I do) it is particularly important you turn away your attention from the mainstream (e.g. the framework of the week) or else you too may become yet another boring corporate drone.

    It is also very important to avoid fads (such as PHP) as well as stuff that gets a lot of attention but only because of the huge publicity behind it and the swarm of clueless people who fall for it (.NET, Windows whatever)

    Finally, it is essential that what you work on is interesting in itself (to you, of course), otherwise no matter how effective a way you find to make it, it will fail to inspire you and without inspiration your mind will deteriorate.

  25. I'm in the same boat. by jumpfroggy · · Score: 1

    I have to say, this sounds a lot like my current situation. I've been out of college working for a few years now, and I always imagined I'd get a job that was challenging and that the learning would never end. But after working in my current job for 2 years, I start to feel that I'm wasting time. I hear about all the neat things other people are doing, and start to feel impatient since I know I'm still in the same rut (simple web applications).

    One thing that helps is finding ways to get into different technologies and different types of problems within your current job. That way you're exposed to more things and makes it a little easier when you start looking for a job.

    The best way to learn for me is the same way I did it through high school and college; figure out how to do something that interests you personally and spend your free time on this. This method worked great during school since I had lots of spare time. Since I've started my "real" job, however, I don't spend any time on personal projects. The real kicker is that I realize that the projects I've been putting off for a year or two are the exact ones that would give me the skills I need for the jobs I want to get into now. As it is, I have the skills neccessary to do something like my current job, which isn't satisfactory.

    I need to set aside a certain amount of time to working on my own projects, so that I don't stagnate in that area. But the only real solution is to switch jobs and find something that does challenge you. My current job could become a career, is very stable, and could be very profitable and secure. But the big drawback is that I know I wouldn't get to do the work I want to. So I'm leaving. What good is all the secure stuff if you don't enjoy it and it basically shackles you away from doing all those other fun things you want to get around to?

    We'll see how this pans out in the next few months. I'm hoping to find a new job that where I can learn some cool new stuff as part of my job (instead of "in spite of my job") and take a little-to-no pay cut. If it works out, then some of the things I've wanted to learn on my own will happen naturally as part of my job, and at the end I'll have more diverse/mature skills and not feel like a horrible joe-vs-the-volcano cog in the machine. Blech.

    Good luck.

  26. Solve problems, but don't worry about full program by porkThreeWays · · Score: 1

    I have to admit many times I'm the same way. I have trouble finishing personal programs. Probably only about 1/4th my hobby programs end up completed. But it's not as bad as it sounds. Many times I'll just solve the difficult parts of a program and that'll be good enough for me. So for example, for many people the next step is dealing directly with hardware. Get some simple hardware like RC motors and get them to do some simple things. Don't worry about a complex program, just solve the problems you currently can't mentally work out quickly. For learning purposes it's the next best thing to actually writing the program end to end. Espically if you have a hard time getting motivated for the boring parts.

    --
    If an officer ever threatens to taze you, say you have a pacemaker.
  27. Modelling by Spiked_Three · · Score: 3, Interesting

    Even though I have 29+ years of programming, I have never worked for a company that had its stuff together as far as product development. They all were poorly conceived, constant moving targets dictated by the sale's department's conversation of the day.

    As far as learning new languages go, that's fine - if you are not already there - I was at the point quite a long time ago where 'its just another language'.

    I finally forced myself to do some small projects in text book perfect approach - requirements - use cases - UML models (and appropriate design (not refactor) patterns - Test driven development. The results were some incredible complex multi-threaded x25 to tcp bridge code that worked first time and was a pleasure to enhance. Never before had I experienced that, and never again since either.

    Anyhow, that was a personal accomplishment / satisfaction. Now if I could only find a company that builds software this way.

    --
    slashdot troll = you make a compelling argument I do not like the implications of.
    1. Re:Modelling by FrankDrebin · · Score: 1

      Hear, hear.

      I find it doubly concerning that by-the-seat-of-the-pants development has been shown to be more costly, yet very few organizations strive to improve process.

      I believe that a group of developers founded on solid software engineering principles can run circles around the hack-and-patch crowd. However, the sales-and-marketing folks usually steer the boat and their motivations and thinking patterns are often orthogonal to the developers. Open source projects have a special attraction in this regard because, at least in theory, the development approach can be guided by engineers. Oh but if it just paid...

      --
      Anybody want a peanut?
    2. Re:Modelling by 1iar_parad0x · · Score: 1

      Yeah, learning how to wrap your head around problems that are bigger than a couple of good 'hacking' sessions is a real skill. Plus, it's HIGHLY marketable. You just have to learn how to advertise yourself.

      --
      What do you mean my sig is repetitive? What do you mean my sig is repetitive? What do you mean....
    3. Re:Modelling by kisielk · · Score: 1

      Modeling?

      Don't you usually have to be good looking and fairly buff to pull off that kind of gig? That pretty much rules it out for most programmer types...

      What does that have to do with being a better coder anyway?

      No, I don't read comment bodies ;p

    4. Re:Modelling by Aceticon · · Score: 1

      Actually as a side note, my personal path to "getting to the next level" as a software developer was (and still is) to try and work as efficiently as possible under the environment you describe.

      This has not only vastly improved my coding abilities (especially when i started also coding for maintenability) but, as i became aware of more and more factors that influenced my efficiency in doing my work (and tried to influence those too), has pushed me into learning software design (which i now also do at a senior level)), software architecture, technical analysis, team leadership and even requirements gathering.

      Nowadays i do software design and development and also, when i get the chance (read: when it's needed and nobody else knows how to do it properly) i do some technical architecture, analysis, team leadership and requirements gathering.

      Maybe it's a little further into the next level than what the OP means, but i suspect the technique holds value even for those that won't want to do anything but coding - just remember to try and figure out the software development process and not just coding, 'cause this will bring into focus things like the importance of coding for maintenability (as in, it will often save your ass).

  28. WHICH next level? by TheSHAD0W · · Score: 2, Insightful

    There are many many sub-disciplines of computer science out there, and the "next level" you're looking for probably involves some degree of specialization. Data mining? 3D in gaming, or photorealism? UI concepts? P2P? I think you're looking for a focus.

  29. Find a new job, but first answer "what skills?" by Anonymous Coward · · Score: 0

    I agree with earlier posts about finding a new job that is challenging. However, I think you need to ask yourself what skills you really want to improve. "Programming" is not really a skill in and of itself. Different jobs will challenge you in different ways, and depending on your personality and career goals (if you have any), you need a different challenge:

    1. Analytical Thinking. All the comments about learning math, a dozen languages, etc. are all really focusing on the idea that programming is about applying computational theory to problems. Algorithms, complexity, correctness, etc.

    2. "Applied" Philosophy of Language and Mind. Some will argue this isn't separable from the previous point, but an aspect of programming is the expression of complex analytical ideas in different forms. Beyond the mathematical equivalence, you learn that there are many other qualities to these expressions, making them more or less suitable for particular purposes. For example, expressing them for the benefit of a stupid compiler/execution system versus for the benefit of other human readers. You can learn a lot about computation by understanding the essence of "semantics-preserving transformation" of programs and phrases.

    3. Software Engineering. An entirely different aspect to real-world programming is the methodology to identify problems, design solutions, implement designs, and validate solutions while managing risk and cost. The best way to learn in this area is by going to work in an established engineering organization. When it ceases to be challenging, be ready to move again.

    4. Psychology and Rhetoric. Don't shoot me for lumping these together, but they are two important aspects of interacting with fellow humans in a productive way. You need to understand how/why people are reacting to conditions beyond your control, and you need to predict how they will react to actions you haven't taken yet. Rhetoric is the subset of this that focuses on speech/communication acts. This is fundamental to advancing in the software engineering space to become a leader or manager of teams.

    5. Specific Languages or Systems. This is where the danger lies for a young programmer. You can quickly open doors with the right skill-set, but you can also quickly close them. There is danger in becoming a specialist in order to find jobs, as opposed to developing a range of specialties through work experience.

    As someone 10 years out of college and who advanced from entry-level programmer analyst to senior architect, working in academia, startups, and interacting with some of the traditional big programming organizations, I think it is wise for young programmers to make sure they are prepared to go it alone. The days of job security in a programming position are fading fast. Get some entrepreneurial skills and consider a future where you might be an independent consultant or principle in your own company. However, take advantage of employment opportunities with established companies to use them as a training ground. Learn what they do. Integrate the parts you like, and think about the parts you don't like too. It may take years of experience, new jobs, and a different context before you appreciate the value of some methods you will witness when starting.

  30. the n x m solution by deltacephei · · Score: 1

    0) go back in the archives and find a contentious 'my favorite language is' debate

    1) make a shortlist of n of the most passionately argued responses

    2) go back in the archives and find a contentious 'this was my worst programming problem nightmare' debate

    3) make a shortlist of m of the most passionately argued responses

    4) create n x m language/problem set and program n solutions to your m problems

    5) post your findings; adjust n, m to suit your available time accordingly but preferably expand them a bit; change "worst" and "nightmare" to "most interesting" and "challenge" depending on whether you're a pessimist or optimist

  31. Get on TopCoder! by Anonymous Coward · · Score: 0

    Get on TopCoder and try out their problem sets or participate in their contests. You'll soon find out how bad you are. :)

    Best of luck!

  32. Answering the original question, sort of... by hackwrench · · Score: 4, Informative

    I don't know about books per se, but these links help:
    http://joel.reddit.com/
    http://programming.reddit.com/
    The design patterns book website with, as I understand it most if not all of the content for the book:
    http://lci.cs.ubbcluj.ro/~raduking/Books/Design%20 Patterns/

    The next three I keep the bookmarks to in a folder called "Practicing programming:
    http://www.devblog3000.com/archives/2-Practicing-P rogramming.html
    http://butunclebob.com/
    http://www.objectmentor.com/resources/publishedArt icles.html

    1. Re:Answering the original question, sort of... by recordMyRides · · Score: 1

      To add one more to the practicing programming folder (or perhaps a new folder called 'Motivation'):
      http://steve.yegge.googlepages.com/practicing-prog ramming

      Every Programmer Should Read This!

  33. some coding advice by sentientbrendan · · Score: 1

    Without knowing your exact skill level, it's difficult to give you advice. However, I can mention a number of things that I see a lot of coders doing wrong.

    1. Not knowing when to use gotos in c:
    Notice that I didn't say not to use gotos. Anyone who says that gotos are just "bad" hasn't programmed in c enough.

    Strictly speaking gotos should be used, and *only* should be used in exactly two classes of programming problems.

    1.1. Deeply nested loops that must be broken out of entirely on some condition of the inner most loop.
    1.2. Error handling. In languages that support exceptions, they can and should be used, but in c gotos should be used in this way:
    result = function1();
    if (result == ERROR) goto error;
    result = function2();
    if (result == ERROR) goto error; ...

    goto cleanup:
    error: //log error message here
    cleanup: //cleanup dynamically allocated memory and close files here before returning.

    As you can see the error section of code is equivalent to a catch block and the cleanup section of code is equivalent to a finally block. There really is no better way to do this in c (without macros wrapping longjmp like objective c does). Be sure not to get too fancy with your gotos here.

    2. Learn object oriented programming techniques. A lot of people learn the very basics in school, and don't go much further. I'll list some areas to look into.
    2.1. If you haven't already, implement some of the basic ADT's (most people did this in school).
    2.2. Learn the special object oriented semantics of your language of choice. Every language has it's own funky way of being object oriented, and you need to know all the gotchas and the best workarounds.
    2.3. Learn about various design patterns. Skim through the Design Patterns book, and try applying various patterns that catch your eye. The important thing that design patterns should teach you is how to write your code as a bunch of loosely coupled components.

    3. Learn about functional langauges and generics. Both functional and generic programming revolve around a set of techniques and programming constructs that are increasingly supported in mainstream c based languages like c++, c#, and java.

    Probably the best way to do this is to learn SML, or ocaml, as these languages are both functional and generic. Many people will recommend learning scheme or LISP, which is a language that is functional, but not generic. Personally, I think that scheme is a poor language, but it has a few interesting features like continuations that are worth learning about.

    All these languages are academic languages not really suitable for real world projects (with the exception of maybe ocaml). The point of learning them is that they do a good job of introducing concepts that are becoming increasingly important in programming.

    Aside from specific skills to learn, the most important thing that you do when you write code is to think about all the different possible ways it could be written, and choose the best one. Also, pay attention to the overall structure of your program. The best kind of program to have is made up of a bunch of components that individually perform very simple and well defined tasks. As a rule it's better to have lots of small classes than a very few big ones.

    There's a lot more that can be said... but I think that should get you started.

  34. What I would recommend? by Anonymous Coward · · Score: 0

    try doing the "hello world" programming challenge. If you find it too difficult there are tons of websites that will help you along with this in any language you choose.

  35. The same problem by trojjan · · Score: 1

    As someone still in college(last year) I am kind of trying to achieve the same thing 'taking my skills to next level'. This discussion has been of tremendous help(thanks /.). Ive learned a few varied languages and I am able to 'solve' most problems but I don't write 'good code'. I mean I do get the job done but its rather ugly. I do not see myself helping with GPLed works because I simply do not have that level of expertise but as a lot of comments suggested maybe studying the code will help me a lot.

  36. My advice by robcfg · · Score: 1

    I've been programming since I was 8 years old and making small games is what kept me improving myself. Even a small game can be quite a challenge. Another big thing is emulation (which is the one I'm into right now), because it gives you a very good understanding how computers really work. I prefer technical documentation on languages or APIs than books, I like to go straight to the point and then do some experiments. So, I'd start a little game and then I'll continue improving it with some graphics and/or sound, just to get the taste of different things.

  37. Variety in jobs and assignments by CptNerd · · Score: 1

    I would say the thing that served me best in enhancing my programming skills was the insane variety of different programming assignments I had through the years. I started on a satellite positioning and monitoring system in VAX Fortran, then immediately became a Smalltalk programmer coding an expert system for computer maintenance, then jumped into network monitoring using Unix, X Window and C, then went to another company where I did Bayesian analysis of text messages in C on Mac OS, then document scanning and management workflow systems, then... well, let's just say I have no domain-specific skills, the only domain I have is pure software development. By working on so many wildly varying systems, I was able to learn the common attributes of good and bad software, how to quickly analyze software for problems and how to develop software more efficiently and correctly.

    If you can't get a variety of different assignments where you are, change companies. If you work for a large defense company, the odds are good that there are many radically different types of software development going on, from business systems, to logistics, to embedded real-time systems. If you want to learn discipline, start at defense contractors. Business systems are far too loose and "get it out the door" to learn good software development discipline and skills. From what I've seen and worked with, I almost want to take all my money out of banks and brokerages and stuff it under my mattress!

    Oh, and as far as learning from books, it just never worked for me. I always learned best from other people, and from existing code. Books are for reference, to look up details about languages, libraries, operating systems, and other tools.

    --
    By the taping of my glasses, something geeky this way passes
  38. here's my 2 cents by randommemoryaccess · · Score: 1

    I'm 25, live in the UK, and have been a web programmer for 8 years, with no college tuition. I've just secured my first project management position, with a very decent payrise. I know I'm not the best programmer in the world, and understand that I have a *lot* to learn, but I know I'm good with the tech I use and project planning, and that's helped me secure the next step on my career path long before my other programming friends. Here's why: I like to refactor, and I like to plan. I've spent many evenings studying what languages I do know (PHP, SQL, JavaScript, XPath, XQuery, XSL) and the systems I use (Linux, Apache, Lighttpd, MySQL, SQLite, XMLDBs). I know their little issues, their niggles, what they're most efficient at, when to use them and why, when to use something else... and I've always enjoyed refactoring my code to as concise a statement as possible. Most people will be screaming "premature refactoring doesn't work!!!" while reading this, but it works for me. I think this is mainly because I don't spend days and days getting 1 script to work at peak efficiency, but every new script I do I apply what I learnt from the last one, and refactor in my head as I code, and I think that helps immensly when you're trying to learn new things. For the past 6 years I've worked in jobs where I was the main programmer in a small team, and its been on my shoulders to plan projects from database to design. If you really want to get ahead fast, get into a small team. Also, try some functional programming. XSL/XQuery is good, Erlang (i've heard) is fun, or some of the others previously mentioned in this thread. If you know OOP, FP will really stretch your braincells! Look at AOP also - JavaScript can be lots of fun when you throw in aspects!

  39. Better to concentrate on what is important by akuzi · · Score: 2, Insightful

    I don't think improving your programming skills is really a worthy
    goal in itself.

    You can be the most skilled programmer in the world, but if you
    just spend your time working on private projects or Top Coder or
    whatever then you are no use to anyone.

    To many people programming is an overly academic exercise in
    self-improvement or entertainment, but really what is it is a valuable
    engineering skill that can be applied to make a positive difference in
    the world.

    If you work on projects you are passionate about the rest will come.

  40. Ada by iliketrash · · Score: 1

    Learn Ada. You'll be amazed.

    1. Re:Ada by Mad+Merlin · · Score: 1
      Learn Ada. You'll be amazed.

      At how unbelieveably awful it is?

    2. Re:Ada by Anonymous Coward · · Score: 0

      Awful? Is that why so much safety-critical code is written in it?

  41. Of course.... by Tainek · · Score: 1

    If reading books and self teaching arnt your thing, helping out a complicated open source project is a great way to learn more and help a good cause

  42. Re:Solve problems, but don't worry about full prog by Silver+Sloth · · Score: 5, Informative
    I once read in Accidental Empires? that there are three types of coders - and the terms are not mine
    1. Code bashers - these are people who bash out endless lines of cobol (probaly VB nowadays) with no real feel for the craft
    2. Hippies - Hippies write good code badly. Once the problem of how to code this task is resolved they lose interest so the actual transformation of the concept to the written code is poorly executed
    3. Nerds - Nerds write bad code very well. Nerds become obsessed with particular techniques and will use that techniqu whether it is relevant or not. However their attention to detail means that the code is well executed
    Looks like you, like me, are a hippie under these definitions.
    --
    init 11 - for when you need that edge.
  43. How wonderful it must be by clickclickdrone · · Score: 4, Insightful

    To have enough spare time to do all the stuff people suggest here. Being married with a family, between commuting, working, doing chores, keeping wife happy, bring up children etc. I get maybe 30mins to an hour a week to myself and then I spend that working on website I sort of inherited after the previous editor bowed out. My commute could be used I guess to do a bit but that's the only time I get to listen to the news etc. on podcasts.
    I can't even imagine having time to learn a language or play with programming for the sake of it.
    To all those who have the time for this, enjoy it while you can and appreciate it.

    --
    I want a list of atrocities done in your name - Recoil
    1. Re:How wonderful it must be by brettdavis4 · · Score: 1

      I'm a single guy and I have a hard time finding to time to study. There are a few reasons on why I can't find time to study. 1. I work out/exercise for about an hour, 5 times a week. When you add in the commute time and taking a quick shower after working out, it becomes and hour and a half. I'd rather be in good shape than be a major fatass with some that knows a lot about programming. The fatass might make more than me, but I'll probably live longer than him. Chics tend to like guys who take care of themselves and gyms have chics in them. 2. I'm also trying to find someone to date and potentially marry. I probably lose 3-8 hours a month doing activites(going to single events/orgs, bar hopping, and swinging by coffee shops) on trying to find someone to date. 3. I also have friends and family I like to see. When I do study, I tend to read more tutorial/project type books. It is a personal preference. I hate reading about a concept and not seeing how it could be used. Wrox and Apress make some pretty good tutorial books. Right now I'm reading, "ASP.net 2.0 Web Programming Problem, Design, Solution" I'm learning how to do something and why to do it. I also tend to read the book faster. I've started to go to some good user groups. They have suggested trying video learning. I've signed up for learnvisualstudio.net and I'm learing some good stuff there.

  44. Study from the Masters of design by hAckz0r · · Score: 1

    Look at source code from the masters of programing such as ACE, TAO, and BOOST. Look at "Design Patterns" and learn to recognize where and how each would be applied. Design your own patterns that could have been used for past projects, and "design" new patterns for new projects. Get your hands dirty in learning several programming languages and learn their strengths and weaknesses and be able to choose which is best for any given project, and be able to defend that position (you may have to). Learn how to program "secure code". (Its not as easy as you might think.) Learn reverse engineering, debugging skills, and know your operating system internals.

  45. Re:Solve problems, but don't worry about full prog by Threni · · Score: 0, Troll

    > Looks like you, like me, are a hippie under these definitions.

    Looks to me like you wasted good money reading a piece of shit book written by an idiot. Perhaps he writes non-technical articles for idiots and has therefore decided not to do any research?

  46. Have a new project by 4D6963 · · Score: 1

    What strategies did Slashdot readers use to improve their programming skills

    Try to think of some project you'd really want to do on your own, make sure it's challenging enough, and then use the ressources you need to succeed.

    That's how I went from just knowing some Pascal from college to learning C and DSP (Digital Signal Processing) on my own. I had a precise idea of the project I wanted to do, even tho I had no idea what it would really take to succeed, but with the help of comp.lang.c, comp.dsp and the documentation they all advised me to provide myself, I literally took my programming skills and mathematical skills to the next level.

    --
    You just got troll'd!
  47. design or implementation? by zatz · · Score: 1

    If you want to get better at writing correct code quickly, I recommend TopCoder. I spent enough years doing ACM and TopCoder competitions that a lot of techniques have become mechanical, and I no longer have to think hard about them to get the details right. (Perhaps I could have achieved the same effect more easily if I used higher-level languages, but I like to work on performance-sensitive problems which require mutable memory and lots of system calls.)

    If you want to design large software systems or create interfaces meant for use by other programmers, I'm less sure what advice to give. Try to get some exposure to different languages or library interfaces and figure out why programmers might like or dislike them, what might be error-prone about them, what affects ease of extension, how to hide unimportant details and allow a diversity of implementations, etc. Look at some time-tested interfaces, eg unix files or windows message queues. Try to understand what problems they solve, how they could be improved, and some of the trade-offs the designer might have considered.

    --

    Java: the COBOL of the new millenium.
  48. oh, almost forgot... by randommemoryaccess · · Score: 1

    I almost forgot - practice makes perfect, so try the Code Kata.

  49. That's nice by HuguesT · · Score: 0, Offtopic

    but can it really work ? even assuming perfect voice recognition and perfect translation abilities (which we don't have), Human interpreters often have to wait till the end of a sentence to be able to translate a word, and real-time word-for-word is totally meaningless, if not impossible.

    As an example, consider german, which can put verbs very very far at the end of a sentence in a stack-like manner (a bit like postfixed LISP).

    To put it mildly this is a very challenging project.

  50. What worked for me by mrjb · · Score: 3, Insightful

    - So far, every time I have changed jobs, I've had to work hard to adapt to the new environment. New environments will keep you on your toes on different technologies, introducing you to new concepts which probably apply to various platforms. Once you've seen Oracle, MySQL, PostgreSQL and SQLServer, you'll likely know how to handle databases. Once you've seen PHP, JSP, ASP and CGI Perl scripts, you'll probably be familiar with the underlying concepts of server-side web programming. See a few flavors of everything and you'll readily adapt to new environments.

    - It's not just about learning new programming languages and platforms. Perhaps to you "The next level" means fewer bugs. Do you already consistently write unit tests? Document requirements? Perform regression testing? Have your code tested by collegue programmers? What about code reviews/code reading? Is your code maintainable? Readable? User-friendly? Well-documented? Bug free? How can you (automatically) prevent these bugs next time? How familiar are you with the infrastructure of your programming environment (version control, build servers, network, etc?)

    - Get familiar with 'new stuff'. I first heard about "Correctness by construction" here on Slashdot. Follow the white rabbit and find out what Spark Ada has to do with this.

    - Learn to do things by yourself, even just as hobby project. Although nowadays it is relatively useless to write your own file compressor/database engine/scripting language/GUI framework/chat program/network protocol/file system/operating system, doing so will give you massive insight in how these work in general.

    - Find someone with whom you can discuss better ways to do things. You will pull each other up. Show your code to each other and discuss improvements. Keep in mind that other programmers sometimes have an opposing view from yours. This doesn't mean that one is right and the other is wrong. (Example: What is better, a micro-kernel or a monolithic kernel? Answer: The truth is probably somewhere between those extremes.) The importance is in understanding the shades of gray between the black and white.

    - If you want to learn, first you must get rid of the strong ego that most programmers build up over the years. Most programmers with a strong ego don't deserve their arrogance anyway.

    --
    Visit http://ringbreak.dnd.utwente.nl/~mrjb/growingbettersoftware to download your free copy of the book
  51. Work is the best post-undergrad training by hey! · · Score: 1

    At the age of 14, Nadia Comaneci was the first gymnast ever to receive a perfect 10.0 score for a routine at the Olympics. A few years ago I heard a sports writer put a typical musty sportswriter question to her: How do you get a perfect 10.0 score? Comaneci's answer was anything but cliche: If you want to get a perfect score you have to try something difficult. While it seems like sticking with easy stuff is a good way avoid mistakes, it actually leads to more errors, because you aren't forced to achieve the level of concentration you need to do the easy things perfectly.

    Marcus Aurelius said that we should strive for perfection in the smallest of things. There is no doubt that excellence requires this, but it is also not humanly possible to do if all you ever deal with are trivialities. I've done some sports coaching, and one thing I've learned from that is progress is always found at the boundaries of what is possible for a person and what is impossible for the athlete. Trying for what is impossible today is a recipe for failure and demoralization. What is often underappreciated is the degree to which staying with what is too easy is also a recipe for failure. Mastering every sport requires repetive effort in perfecting the basics; however without the stimulation of a challenge, the quality of that effort is severely undermined.

    The answer for a programmer is that you have to find an element that challenges your skills in even the most routine of projects. It does not do to be too risk averse. Many projects lose focus because programmers spend too much of their time in blind alleys searching for a bit of intellectual stimulation. I'm consulting these days, but back when I ran a stable of programmers, I always emphasized that my guys find "take-aways" on every single project. A "take-away" is something you have at the end of the project that enhances your ability to do future projects. Sometimes this is a library or a framework, but I think the desire to create "intellectual property" sometimes creates premature attempts at framework creation. The basic content of a take-away is know how; once the know how is there it can be productized, not before.

    No matter how trivial or routine the project, you must strive to find a take-away, otherwise your ambition dies and your skill stagnates.

    Most people become programmers because they had a few moments of intellectual stimulation -- fun -- in learning how software works. If that's what motivates somebody to become a programmer, that's what will motivate him to become a better programmer, and to achieve his best. Put something fun into the requirements of every project -- whether it is a contracted deliverable or not.

    --
    Post may contain irony: discontinue use if experiencing mood swings, nausea or elevated blood pressure.
  52. Avoid overly bitter OcamL/Lisp/Eifel freaks on /. by Qbertino · · Score: 4, Insightful

    Someone calling 'Java Web Programming' boring and PHP a fad. [sarcasm]Gee wizz, what kind of person could that be?[/sarcasm]

    1) Neither Java or Webprogramming or both together are boring. It's jobs and projects that can be boring. If it isn't your thing, don't do it. And if the webstuff your doing in Java actually *is* boring, you might want to consider switching your framework? The current, somewhat justified hype is Rails but I'd actually suggest Symfony. Which, in second instance. is a PHP framework.

    2) Sorry to be raining on your parade, but you're talking out of your ass. PHP isn't a fad. It was an Open Source SSI template solution that scratched an itch ten years back that could be solved satisfactory with Perl alone. Now it has grown to number two in the server side game, moping the floor with Cold Fusion, ASP and a few failed, sad and sorry attempts at consistent Java webframe projects. It's easy to learn, has by far the largest amount of very mature and successfull OSS webprojects and scares the living piss out of BEA, Intersystems and the occasional MS web plattform division.

    PHP is a descendant of Perl and thus simularly crazy, no doubt - but calling it a fad puts you in the classic position of an anti-social, they're-all-holding-me-back Lisp/Ocaml/Eifel/[fill in rare academic PL here] crack that's actually best off *not* doing any stuff that requires frequent team interaction, such as - believe it or not - web projects. Ever considered doing exotic science stuff on large supercomputers or bio-IT or so? Chances are you'll feel like a bug in a rug in those fields.

    Real world programming is about learning to cope with the restrictions of the real world, called load distribution, wacky and stone-age database concepts (you call PHP a fad but don't lose a word on SQL - how am I supposed to take your opinion for granted?), inconsistent and/or non-existing developement pipelines in dire need of updating, shoestring budgets and the occasional boss/client poping in and overthrowing everything. Programming and IT is about helping the people along, raising your boss/client to be aware of the needs of solid IT and it's resulting advantages and, in the end - believe it or not - acually delivering marketable results. All together makes up the skill of a good programmer. Pick your technology - whatever it may be it doesn't matter, only OSS may be a prerequisite - and get on with becoming one.

    That's 2 cents from a client- and server-side web developer.

    --
    We suffer more in our imagination than in reality. - Seneca
  53. Some C and C++ recommendations by LizardKing · · Score: 1

    C++ Programming Style by T. Cargill

    Quite an old book, but it is great for learning how to identify dubiously structured code and then improve it.

    Advanced C++ Programming Styles and Idioms J. Coplien

    Again, quite an old book, but it covers "programming in the large" rather than than the nuts and bolts that many books describe.

    Design Patterns G. Booch, et al

    I was initially underwhelmed by this book, partly because the hype surrounding it was so great, and because I had already been using a number of the patterns without knowing it thanks to Java. However, the really useful patterns are nicely presented.

    Apart from books, I learned a lot from picking over things like Glib, the utility library that underpins GTK+. The code is of a very high quality and includes a number of interesting ideas.

    As well as programming languages themselves, it's worthwhile looking at things like unit testing and design aids such as UML. The Java web development gurus have focused a lot of peoples attention on the benefits of truly modular code, dependency injection, testing and so forth. This largely stems from the pain of early Java web development and a general dissatisfaction with EJB. I certainly feel I'm a much better C and C++ programmer as a result of doing a lot of Java work in recent years.

  54. "Next level?" by Guppy06 · · Score: 1

    If you use that phrase in a sentence talking about anything other than video games, it's time to move from CS to an MBA.

  55. Important Lesson by Anonymous Coward · · Score: 0
    One of the important tools is the programming language. Languages should be rich enough so that they are expressive and simple enough to use and learn. If you are going to use a programming language for many years it is worthwhile to use a rich language and to learn it deeply. If you are going to use a language for a year or less it had better be simple.

    After I learned and was first using C, over a decade ago, I realized that I was only using a subset of its power. This was solved by C Puzzle Book by Alan Feuer. This book breaks down the C language into small component parts and alternately teaches you and drills you on all the features and how to use them in small, incremental steps of increasing complexity. It is required reading for programmers using C, once they've learned the basics.

    After you've learned the language in absolutely all its features, read and study Programming Pearls by Jon Bentley.

    By the way, the great computer scientists and super coders are by and large not wealthy. If you want to get rich, get an MBA and then get very lucky. Being a super techie will mostly make your employers richer.

  56. Goths by Anonymous Coward · · Score: 0

    Anyone ever notice you never see a West Indian goth?

  57. Re:Solve problems, but don't worry about full prog by SomeoneGotMyNick · · Score: 4, Funny
    3. Nerds - Nerds write bad code very well. Nerds become obsessed with particular techniques and will use that techniqu whether it is relevant or not. However their attention to detail means that the code is well executed

    Oh God!!!! That's ME!!!!! Why didn't anybody tell me this SOONER!!!! I feel so ASHAMED!!!! I need to re-program my Segway to lead me off of the edge of a bridge. I think I'll use a variant of the Medial Axis Transform of the city model to determine best path.

  58. Re:Solve problems, but don't worry about full prog by ggambett · · Score: 1

    There are also artists, who try to solve the problem efficiently and in an elegant way. My goal is to reach that state.

  59. Work with good people by JoeKilner · · Score: 1

    Find some really good people and work with them and learn from them. That means, start interviewing for other jobs and use the interview to see if the new place has people you can (and want to) learn from.

    Also look around at everything else in the IT sphere and try to learn from it. Most of the big things out there have some good points and some bad points. While it is easy (and popular in this particular corner of the web) to point out the bad points in chunks of technology, it is much more instructive to look for the good points and try to see how you can incorporate them in to your own designs.

    My own coding took off to much higher levels when I started caring about the quality of my code (as I transitioned from computer games to network infrastructure). I.e. not - "how clever and fast can I make this?" but "how robust, easily maintainable, secure, standardised, etc. can I make this?". In making this change I realised that the two are not incompattible and my coding abilities increased loads.

    Finally my own words of wisdom - programming consists of two parts - computer science and software engineering. Computer science is (more or less) the art of taking logical problems and redifining them in a special mathematical notation so that they can be understood by a computer, software engineering is (roughly) the art of taking everyday problems and redifining them as logical problems (plus caring about quality etc.). Chances are you are good at one of these and not the other, so turn around,face in the appropriate direction and start learning.

  60. Design Patterns by sottitron · · Score: 1

    Not sure if your curriculum covered Design Patterns or not, but if you were well versed in them, I doubt you'd be feeling like you weren't reaching the "Next Level." Head First Design Patterns is a great book IMO. Also, go looking for stuff you don't already know. Aspect Oriented Programming is fascinating. Ruby on Rails is cool if you've never seen it. If you want a challenge, try writing about programming and see how fast you find you HAVE to ramp up. Thing is, once you see something, you have to use it to become an expert. Also, be clear about what an expert is! As a novice you are still learning "What" as in what to do. As a practitioner, you'll know "How" as in how to do it (just about every time). But if you want to be a true expert, it will be about "Who" as in who should the community look to as a thought leader - if you are an expert the answer will be YOU. Be warned, a lot of practitioners AND novices will try to claim to be experts, but ask them about the articles they've written or who exactly reveres them as an expert... Also, lots of this has to be done on your own time if you are not willing to go out and get THE JOB for you. And honestly, if you are not willing to do that, how likely are you to spend your own time getting to "The Next Level" anyway?

  61. Some thoughts by plopez · · Score: 1

    1) Be humble.
    2) Practice, practice, practice.
    3) Learn as many programming paradigms as you can stand.
    4) Stop writing programs, start writing libraries and frameworks (and tool kits).
    5) Learn to write programs that write programs.
    6) Some quick reading on AI doesn't hurt.
    7) Know your tool set! Only then will you be able to use it effectively and also its limits.
    8) Understand data, data modeling and relational databases. Without data, programs are useless (and even a mouse click is data).
    9) Understand what OO really is and use it (hint, it is a lot more than just packaging up operations with data).
    10) Learn compilers.
    11) A little abstract algebra doesn't hurt.
    12) Find the most capable programmers in your area and try to either work with them or hang out with them. The best way to learn is by good example.

    If you do this you will find in a few years that you will be no longer writing 'COBOL in drag'.

    --
    putting the 'B' in LGBTQ+
  62. Start or join a hobby project by JoeCommodore · · Score: 1

    Find something that utilizes your desired skills as a project for an off-ours hobby, coding a game, improving some website you runm, etc. Make sure it hit on the next level challenges you are going for. (it does not have to be grand to start, just somehting you think you can accomplish)

    Then do it. You only get some knowldge of the concept reading books and artricles, but you won't be skilled at anytrhing it until you do it yourself.

    And if you pick a project or it leads to something you haven't seen done elsewhere or not as well as you can envision it, who knows, down the road you may have created the next youtube or myspace.

    --
    "Enjoy what you're doing! If it becomes drudgery, you're doing it wrong!" - Jim Butterfield
  63. Re:Solve problems, but don't worry about full prog by zenon3 · · Score: 1

    I think that attitude is actually the #3 Nerd. I've noticed that sometimes nice and elegant equals overengineered. Sometimes it's good to have non-elegant code to maintain readability. Ever notice when you get the code wonderfully elegant, but it's really saving anything? It doesn't perform better. It's not more flexible(takes as much or more time to modify). Rather than typing two pages of code, it's only half a page(big deal). It takes longer to write because you actually have to think about it. You just have to realize when your awesome generalized functions or recursive masterpiece is overengineered for your little form based frontend to the database.

  64. Language certifications will push you... by (H)elix1 · · Score: 1

    Some of the language certification tests will push you. One of the things about working on the job is even a crummy company will usually put rules into place that prevent you from doing really ugly things. I mean, "__$_" is a perfectly valid variable name in Java, but I've never known anyone with enough brass to try and push something like that through a code review. Anyhow, I found the Java certification (and a C++ one back in the day) really pushed my understanding of the language itself. Worth doing, if you are looking to hone some skills and not just trying the bare minimum needed to pass a test.

    The other thing is to mentor an intern or junior programmer. Few things will push you to 'do things right' more than being an example for others to emulate.

  65. Mod parent up by AlXtreme · · Score: 1
    Grandparent probably still lives in academia and probably never has had a real job. Parent is right on.

    Lisp is fun to play around with, but Paul Graham's Viaweb wasn't aquired by Yahoo because of it. The idea behind Viaweb was new, and during the dot-com bubble it didn't matter if you wrote in C, Lisp or punch-card machine code: you'd make insane amounts of venture capital anyway.

    --
    This sig is intentionally left blank
  66. What I did to exercise my programming by Tronster · · Score: 2, Informative

    For about a year I had "The C++ Programming Language" book by Stroustrup, but only used it for reference. Then when I had some free time, I got the idea of doing the problems in the end of each chapter. Not just the easy or hard problems... all of them.

    What I found out was a lot of problems that I thought were trivial, weren't. It really forced me to push ahead, learn STL and the Zen of pointers. The few times I got stuck, I'd send an e-mail to a few other geeky developers (like me) on my work team the next day at lunch, and had a good time trying to solve what appeared to be a simple problem.

    I found that at the end of a few weeks of going through the first few chapters, I just "knew" STL and C++ that much better.

    So my recommendation:
    1. Find a good book that ranked well in your area of interest
    2. Be sure the book has a set of solve-your-own problems at the end of them
    3. Solve them ;)

  67. Re:Solve problems, but don't worry about full prog by Anonymous Coward · · Score: 0

    What are you describing is not elegant, at least, Dijkstra once said that elegant = simple + efficient. Oh yes, I consider myself an artisan trying to craft elegant code :-)

  68. Re:Solve problems, but don't worry about full prog by srmalloy · · Score: 1

    There are situations where a brute-force solution is more practical than an elegantly-crafted solution. However, from what I've seen, software development has been a steady parade of "brute force uber alles" decisions, resulting in hardware requirements continually ratcheting higher and higher in order to run the code as fast as the previous version, because someone decided that it was an earth-shatteringly necessary program enhancement that the drop-down lists animated their expansion when you clicked on them instead of just BITBLTing the entire drop-down area onto the screen at once. As the virtual memory space available to programs has grown, the amount of care that programmers take to write efficient code seems to have gone down. Faster machines conceal sloppy, less-efficient code, and more memory conceals bloated, space-wasting code; whether this is a case of not being taught to write tight code, or accumulated sloppiness from not having to write tight code, I don't know.

    At a previous job, I remember looking at one source file from a program that a contractor was developing for us; in each of two dozen functions in the file, they had the same data structure defined local to that function -- a 1000-element array of a structure with about a dozen numeric fields and four 256-character text fields. None of the functions in the file used the text fields in the structure; the structure had been copied from another file where a function did use the text fields, even though the functions didn't actually pass that structure between them; the data was read out of a database in each function. Even more entertaining was the fact that the first time we tested their code on real data, the function that did use the text fields in the structure cheerfully filled the staticly-size 1000-element array with the 2315 rows of data from our database, stomped all over itself because they hadn't put in any bounds checking, and crashed. My code, in a separate program that referenced the same data, used a linked-list module I'd written so that I didn't have to worry about whether I'd made the arrays big enough, and only allocated storage that was actually needed for the database content. I found out later that, after we'd turned the locally-developed code over to the contractor for maintenance support, that they went through and rewrote all my code to use fixed-length arrays, and had an ongoing failure problem due to the real-world data being bigger than the arrays they'd hard-coded into the software, making them go back and rebuild their code each time they got a crash report from the users. Made me wonder how they managed to stay in business with programmers like that.

  69. Exceptional C++ by frantzdb · · Score: 1

    If you are a C++ programmer, I suggest reading Exceptional C++ and the other books in that series and the corresponding Guru of the Week archive. You can know a lot of C++ and not know much of what's in there. I found I had a much deeper understanding of C++ by reading it and my coding style has changed (for the better, I hope) as a result.

  70. Re:Solve problems, but don't worry about full prog by Abcd1234 · · Score: 2, Insightful

    Rather than typing two pages of code, it's only half a page(big deal).

    Umm... elegance is not measured by terseness. It's measured primarily by clarity, ease of maintenance, ease of extension, ease of code reuse, and probably many other factors. What you describe is "clever" code, but it's not necessarily elegant.

    BTW, as an aside, writing clean, elegant code rarely pays off in the short term. However, 6 months or a year down the line (or, better yet 10 years), well written, elegant code will almost always pay off in spades.

  71. Elegance? by Anonymous Coward · · Score: 0

    I've noticed that sometimes nice and elegant equals overengineered.

    You hippy.

  72. Re:Solve problems, but don't worry about full prog by Gr8Apes · · Score: 2, Insightful

    Heck, 3 months down the line in my experience. And it always pays off. Even the first time. Try going back over your last project to fix those bugs. Yep - much easier usually with "elegant" code.

    --
    The cesspool just got a check and balance.
  73. The three Rs by Paradise+Pete · · Score: 1
    Readin' Ritin, and Rithmetic.

    Read. It's a never-ending race to keep up.
    Write programs. It's just like how you get to Carnegie Hall - practice, practice, practice.
    Learn some more math. Every once in a while a seemingly daunting programming problem will suddenly have a simple and elegant solution just because you happened to understand some mathematical principle.

  74. Expanding your abilities... by kabz · · Score: 1

    Well, here's my advice:

    1. Read lots of good and bad code, and understand how it fits into a system. Occasionally, you see code from great programmers that is stupidly overengineered with abstract types representing every tiny little object, and the code is very hard to follow.
    Good code should be clear and concise.

    2. Write code for maintenance programmers. For big systems, you almost certainly won't be maintaining the code. Some other guy (or gal) will. Write the code for them to understand. Keep it simple, commented and clear.

    3. Code often goes through design iterations. Write the simplest code that can work efficiently. Use an appropriate data structure. Minimize temporary object creation etc.

    4. Learn a functional language. This gives a new viewpoint that can be useful, though it's a slow way to learn memoization, which may be the most useful thing ever.

    5. Don't be afraid to refactor. Most of the good code in the world didn't look that great when it was first written.

    Good luck!!

    --
    -- "It's not stalking if you're married!" My Wife.
  75. Work under a deadline / with someone smart by breadbot · · Score: 1

    It may sound Philistine, but I think one of the very best ways to get better at something is to do it under pressure. With programming, having a smart mentor nearby can be a tremendous help in such a situation, but even working alone under pressure will both (1) improve your understanding, and (2) stretch your capacity (endurance, memory, etc).

    That pressure can come from either an external deadline or, if you are able to do it, an internal one (more difficult to achieve, IMO). Programming contests may be a really good place to find them: you get all three: (1) interesting, difficult problems, (2) time pressure, and (3) smart mentors (well, only partially, since you can only get advice by viewing others' code after the fact).

    As long as you get enough sleep, that is :)

  76. Improving Development Skills by esammer · · Score: 5, Insightful

    Not having had the advantage of a formal education (I have a GED and otherwise I am self taught) I've had to resort to, in some cases, drastic means of career as well as technical information acquisition. I have found the following to be consistently true.

    1. You are rarely given additional responsibility (i.e. new projects, new technologies, "hard" stuff) at a job without first proving that you can do it. This usually involves doing things that "aren't my job" without getting paid for it for a certain amount of time and then being your own advocate after the fact. No one deserves anything on their own word. Find new things going on at work and put yourself square in the middle of it. Nothing interesting going on? Start analyzing the development process and environment and propose ways of making it better (and ofter to execute said plan).

    2. Read. A lot. I highly recommend O'Reilly's Safari Bookshelf thingie. Some people don't like to read on line and prefer "real" books. I think that's cool, but you can't let that be a reason why you don't read. If you can't afford to buy all the new tech books you want to read, get a library card. Live in some strange place with no libraries? Find a way. You will if you want it.

    3. Read non-technical articles and resources about the development process, software design and architecture, intergration methods. You know, "sciencey" type stuff. I find that I like certain authors more than others. For instance, Martin Fowler (http://www.martinfowler.com/) is the author of many excellent books and is known for his work in design patterns and architecture. If you read nothing else, read his work. Remember there's a much bigger world than writing guest book "scripts" 10,000 times (and thank insert-deity-here that's true).

    4. Talk to other people. Anyone. Everyone. Project managers, developers, system administrators, architects, analysts, QA folk, telco employees, and anyone else that will give you the time of day. Learn what they do, how they do it, why they do it that way, and how it effects what you do and why. You'll have a much better understanding of distributed computing if you understand network and security principals and how they apply (and you might just not open up yet another SQL inject bug because of it).

    5. Commit yourself to improving your craft by practicing it. Constantly. I find that being involved in open source development is 100% free peer reviewed experiance. Additionally, the open source work I've done in the past has won me a job or two. You never know when you might meet someone important to advancing your life.

    6. Consider everyone you meet a student who may benefit from you, but more importantly, a teacher no matter how much smarter you think you are. Discuss, debate, learn, integrate new knowledge, repeat.

    7. Find a mentor. Someone willing to take you under their wing (whether they know it or not) and soak information from them like a sponge. Don't know one? That's why I said *find* one. Very few people learn things themselves. Most people are taught by others, if by written or spoken word, code, IRC, or otherwise. I can't stress the mentor thing enough. Find two. Three is better. Find mentors that don't agree with one another and compare ideas. Learn from everyone.

    This is what has worked for me. I dropped out of high school, got a GED ("good enough diploma"), and got really lucky in meeting the people I did. I do software architecture and design for a living in addition to mentoring and "grooming" developers. I learn more from them in a single day than I learned from any book (give or take).

    Good luck. If you're trying to figure out why you aren't where you want to be or why you haven't attained what you want, you're already a step ahead of everyone else. You'll be fine.

  77. How do you know? by www.sorehands.com · · Score: 1

    How do you know it is really a compiler bug until you look at the compiler output?

    You can guess by saying with certain options, the program works, and with other options the program fails. But,you cannot be sure until you read the code.

    What you said about rewriting code to avoid the problem reminded me of when I had a bug with Masm which would not do proper offsets with structures, so I changed the order of the structure so it would not matter. The problem is that before you change the code (or compiler options) you should know the problem, not just guess it.

  78. Write tools by slapout · · Score: 1

    I try to write tools that will make my and my co-worker's lives easier. I usually end up learning a few things along the way. Plus I end up with a time saving utility.

    --
    Coder's Stone: The programming language quick ref for iPad
  79. You missed the point. by Generic+Player · · Score: 1

    Viaweb wasn't the only player. There were several others. Viaweb was aquired by yahoo because it was the best. It was the best because they were using a productive language (lisp in this case, but it doesn't have to be lisp) instead of an "industry best practices" language like their C++ using competition. So while yahoo didn't say "oh sweet, its a lisp app, we better buy them", lisp was indirectly the reason yahoo bought them.

  80. Re:Avoid overly bitter OcamL/Lisp/Eifel freaks on by convolvatron · · Score: 1

    grandparent is correct.

    learn how to do metaprogramming. learn how to write operating systems, compilers,
    and design languages. then when you have to do some random server-side crap, you
    can do it less time, with greater extensibility and stability, and have more
    fun doing it.

    or you can spend the rest of your life spitting out the same little balls of
    php.

  81. Read Code by smcdow · · Score: 1

    They say that you can't be a great writer unless and until you've done close readings of great works of literature.

    Similarly, it's extremely elightening to do close readings of source code of software projects you consider "great". Pick a "great" (or even not-so-great) software project for which you have access to the source code. Download the source. Then, do a close reading of the source. Understand how the software works, control flow, data organization, class heirarchies, etc., even the build system.

    You might decide that in the end that it's crap, but you'll never know until you read it. But it does provide a good method for learning a lot about how software is put together. Many (but not all) open-source projects are very close to doing best practices due to the collective nature of the development.

    --
    In the course of every project, it will become necessary to shoot the scientists and begin production.
  82. Plug away at work by hermit850 · · Score: 1

    1) Use downtime at work as a chance to learn. Since you're stuck there anyways, grab an sdk that interests you and plug away. Your boss would probably like it better if he/she saw an IDE open on your desktop, not myspace.

    2) Get another hobby. Juggling two hobbys will help you value your time more. I rarely do any programming at home mostly because I'd much rather be doing something else. Granted I have lots of downtime at work, I try to do some hobby-coding while I'm there.

    Which brings up a question, is hobby-coding at work bad during downtime? I downloaded the DirectX SDK and I'm teaching myself a little game programming. I don't see this as an issue if this doesn't interfere with my work. It actually keeps me off the net and makes the day go much faster. Although, I'm a government employee ;)

  83. Hard skills aint enough anymore by diezel1977 · · Score: 1

    There's a pretty interesting article posted on Computerworld's site today that details why it's increasingly difficult to find solid IT jobs even though more and more companies are preparing to hire. http://www.itworldcanada.com/a/IT-Workplace/dc4b99 1d-1d3b-4c26-ae56-3bb84c0faf9f.html

  84. "The Next Level"? by R3d+M3rcury · · Score: 1

    Dude, check out Extreme Programming! That will let you take your skillz TO THE MAX!!

  85. What helps me.is.... by lordmage · · Score: 1

    Programming in a group outside of work on a GAME. Simple things with simple features with hard basics. A MUD.. a strong mud is fun and you get the whole cornacopia of techniques from hash tables, jump tables, file functions, sockets, performance and other issues.

    Make a Game online and find out how fast you improve.

    My problem is not work is not challenging.. is that its very challenging and a MUD is a way to relax code and learn without having to learn under power pressure.

    www.mageslair.net

    --
    I can program myself out of a Hello World Contest!!
  86. Work on an OSS project by aztektum · · Score: 1

    Goto sf.net and look through projects. See if you might be able to help out in an active project that lies outside your typical knowledge base.

    In college you probably learned a lot of the concepts that many projects rely on, but in order to increase your skills you have to branch out from the day to day. If you're using the same languages and spending long stretches working on the same projects (for work or whatever) you're not going to expand your technique very much.

    To get stronger you have to build more muscle, building more muscle requires lifting heavier weights.

    --
    :: aztek ::
    No sig for you!!
  87. But what about book recommendations? by farker+haiku · · Score: 1

    I'm a fledgling programmer looking for advice on how to take my programming skills to the next level. I've read Petzold's programming in the key of c#, and teach yourself ruby in 21 days. I've taken the "advanced java" course (and all the programming classes for that matter) at the local community college, but I feel like I've missed out on anything vaguely complicated. advanced java was all jsp stuff interacting w/databases, and the other classes didn't really do anything for me(they tried, but how many times can you write hello world?). What would be the next steps you all recommend for someone who wants to learn programming, is willing to set aside time to do so, but does tech support full time so isn't given programming type tasks at work?

    --
    Your sig(k) has been stolen. There is a puff of smoke!
  88. volunteer to assist an open-source project by mrflash818 · · Score: 0

    If I may, perhaps volunteer to assist an open-source project.

    Try to find a project that is of interest to you, and is using modern techniques, environment, languages, etc.

    --
    Uh, Linux geek since 1999.
  89. Go down a level by tootlemonde · · Score: 1

    I feel that my programming skills haven't really progressed to the next level as I had hoped

    One poster suggested facetiously to try going down a level. However, there is merit in this suggestion. Try going back to something more basic than programming. Go deeper into the math, the algorithms, the machine architecture. These are the things that a CS degrees prepares you do and they should give you insights into problem solving that programming cannot.

    For most programmers, progress is quantitative. The more they know, the more they can do. They may not be better programmers but they are better employees. Many of us understand that while there is no limit to how much we can learn, there is a limit to how good we can get. You may have simply reached that limit. Now, you have to settle in for a lifetime of typing code (not as bad a fate as you might think), or take a step back and revisit the fundamentals.

    If you don't find inspiration there, maybe you should be looking outside the profession altogether.

  90. Join a project. by tomd123 · · Score: 0

    Join a project that seems like a challenging topic. You will learn so much more... sourforge.net has tons to join. I thought I knew alot about programming but its different to actually be part of a project which you are unfamiliar with. Try to find a project written with a diff language, you'll learn more.

  91. Great books to help you by kiwipom · · Score: 1

    Hi, I'd definitely recommend the Pragmatic Programmer http://www.amazon.com/Pragmatic-Programmer-Journey man-Master/dp/020161622X/sr=1-1/qid=1161902709/ref =sr_1_1/104-0184310-1779920?ie=UTF8&s=books It's a great book and really well written, by the time you've finished not only will you be full of useful knowledge, but you'll be raring to use it. I'd also recommend the Write Great Code series especially this one, Thinking Low Level, Writing High Level, http://www.amazon.com/Write-Great-Code-Low-Level-H igh-Level/dp/1593270658/sr=1-1/qid=1161903244/ref= sr_1_1/104-0184310-1779920?ie=UTF8&s=books this book really opens your eyes about what your code is doing. Enjoy!

    --
    Dum spiro spero
  92. participate in a small and fun contest by bigorilla · · Score: 1

    if the following apply to you:
    * you are sometimes excited about programming
    * you like games
    * you are a creative person
    * you have 2 days to spare

    then go participate in one of the 48hrs game development contests or pyweek or something.

  93. Start a BIG home project by rmerry72 · · Score: 1

    Four years ago I started a project at home in order to flex my programming muscles in new technologies. The project was to build a home network, media centre, home automataion, etc. Build my own "smart house" essentially with an English interface, speech, PDA, and a bunch of other ways me and mine could control the house, our entertainment and orgaise our lives.

    Now I have six PCs spread across the house with a fast network, permanent net connection and a family of cherubs that use this stuff everyday. So in thtat sense its been very practicial as our lives have been transformed from the sheer ease with which we now live.

    The technology benefit: I've had to build my own boxes, install o/s and configure the network. I've customed built a two linux boxes, a media centre, and added other hardware. I've had to custom write a control system, media catalog and allow it to be fully distributed both externally and at home accessible from any box (or even from work through proxies) and have faced problems that your not going to face any other way. Whilst I've written most of it in Java I've had to spread into a diverse range of Java technologies, hook into MS Outlook and other .NET stuff, interface with Winamp, and other media players. I've even hooked up a remote dialler, linked to an SMS gateway and have caller ID installed. At one stage I was plowing through the ID2 spec to read MP3 tags and then jumped onto the RIFF spec to catalog AVIs. Deep stuff.

    In short, a bucket-load of technologies, both hardware and software, that I would never, ever, get my hands on in my professional roles. I've faced a myraid of difficult problems, spent lots of late nights arguing with the thing, and shouted loudly. I have learnt an immense shit-load in a variety of tools and specialities. The project (Blade, see my URL) comes up n every interview lately with much discussion on the technologies that I've had to learn. Its proudly on my resume.

    The best bit is that whilst learning I've built something that benefits me and my family immensly, which is always a proven motivator. Much more motivating than learning something because its your job. And the scale of the project will keep me learning and adapting for the next coupe of decades.

    Best of all - my wife and kids are proud of me :-) Shucks. Rick

    --
    We do not inherit the Earth from our parents. We borrow it from our children.
  94. Start and OSS project by aybiss · · Score: 0

    No matter how inane your idea, start a project online. Submit it to various places like BetaNews. Learn how to deal with front line programming - you will find each day is a new challenge. I've learnt an incredible amount from silly projects. Case in point would be a little backup app I wrote. I had to learn about living in the system tray, playing nice with computer shutdown events, and a million other little things I never thought of at the outset.

    In short as many other people are saying: practice makes perfect. In my opinion, putting yourself out there is important because the stupidity of users and the obscurity of their feature requests makes you go outside your comfort zone. Programming to suit your own needs won't provide the same level of motivation for learning.

    As for learning a new language, I've always been able to pick them up as needed. Learning a new language probably won't give you the same thrill as going deeper than you have before with one you know.

    --
    It's OK Bender, there's no such thing as 2.
  95. Slashdot Poll by CaptainPinko · · Score: 1

    I think this would make for an interesting /. poll. Especially if people started to post things like what OSes, programming languages, and IDEs they use. I'm definitely a hippie myself.

    --
    Your CPU is not doing anything else, at least do something.
  96. Work with smart people by Anonymous Coward · · Score: 0

    If noone you work with knows more than you, they can't teach you much. If you work with people that know more than you, they can teach you tremendous amounts. Take advantage of that. Learn all you can from them. When you know as much or more than they do, find a new job with people who know more than you. Many people are intimidated by working with people more knowledgable than them. Don't be. It's really not all that different from your formal education. You just get paid for it :)

  97. Re:ASM (for real programmers only!) by FractalZone · · Score: 1

    Learn assembly language and write a simple app like rudimentary text editor or line-art drawing tool, something that requires most of the basic IO functions. (Then try an application launching menu - yay memory management! :)

    I agree with what you said, but am going to explain why it helps to be good at one (or several) assembly languages.

    If you can write I/O routines and convert the sort of algorithms needed to write a text editor into .asm code, you understand what is really going on at the machine level. That knowledge will allow you to grow beyond being a VB coder (the modern equivalent of a the old COBOL coder) who can't do much except slap together classes (modules) that some real programmer designed, wrote and tested.

    --
    "You're young, you're drunk, you're in bed, you have knives; shit happens." -- Angelina Jolie
  98. next level? by Anonymous Coward · · Score: 0

    .. learn Common Lisp.

  99. Re:Avoid overly bitter OcamL/Lisp/Eifel freaks .. by Nicolay77 · · Score: 1

    I sort of agree and disagree with you and the GP.

    First, Lisp is a better language, it has concepts yet to be discovered in most other languages, but you have to study the language and code non trivial examples to grok that, no book or /. comment will help you there.

    Second, C++ and PHP are not fads. I can tell that because have used both C++ and PHP since long before I had learned Lisp. Also, C++ and PHP are the ones that give me money, something Lisp has not done yet.

    But just last week I was really hoping that PHP had closures and first order functions, as that would have made my job much easier. In fact, that sensation of "well I feel like trapped in this language" is real but anyway it doesn't matter.

    Why? because you can code anything in any language. Sometimes what is trivial in Lisp requires a mini-parser in other languages, that is, a little more coding. Or some other technique. but it's equally doable and it doesn't matter what language I use, I still code much faster than my co-workers. And I get things done.

    But in direct response to your post, well those academics have a point. Better languages can really give better solutions. However, the bad news are: Lisp stopped evolving a long time ago, with a small rebirth because of P. Graham since about 3 years, but still lacks a good free windows implementation to get all those programers that could need it. Yes, MSWindows is important, as finally PostgreSQL developers discovered, a little late after MySQL had almost all the marketshare. Otherwise USD$2000 is too expensive for a programming language license, if you have to choose between C# or Java and Lisp.

    My point? There is a good oportunity to bring a nice GUI enabled BSD licensed version of Lisp for MSWindows (multiplatform would be better) and I would jump to it in a second if it existed.

    (Note to lisp zealots: wxCL doesn't cut it, as it simply doesn't compile in my box. And most Lisp implementations are GPL or LGPL and they infect my code. LGLP infects code when linking statically which simply misses the point of ECL. I'm waiting for SBCL on MSWindows. The SBCL license is a good one.)

    --
    We are Turing O-Machines. The Oracle is out there.
  100. The best programmers are hobbiests by EvilTwinSkippy · · Score: 1
    All of my great improvements as a programmer have been on side projects, personal quests, or oddball ventures. I code for fun, it is a hobby. Yes, I program a lot at work, but work is time critical. It draws on the experience I get programming on my own. And I can't tell you how many times a side project has solved a problem on the shop floor.

    Pick a favorite language, and just code for fun. The skills will come later.

    --
    "Learning is not compulsory... neither is survival."
    --Dr.W.Edwards Deming
  101. do different useful jobs by redjupiter · · Score: 1

    HI I was in the same situation programming/maintaining Unix Server/Clients in the financial industry for about 5 years. After few years I wanted to learn more skills. I fancied giving training in programing so I got a job doing just that. After three years, I joind a vendor doing mobile phone operating system as software enginer (debugger/tester). during which, I used to hear a lot of horror stories about support in the software industry. I fancied doing that so I joined a vendor for real time operating system as technical support engineer level 2 and 3. I liked it so much that I stayed there for about 7 years. It was the most challenging aspect of my career. the interactionwiht other software engineers formoutside the company was incredible and a mine of learning. Few months ago I wanted more challenging job, and thats when I was transferred as a senior enigner in the professional services department. This is the ultimate challenge for me. The ability to take on projects at very short notice about a subject you vaguely know and be able to deliver on time. So now I am on the road and work from home :-) and travelling the world. The pressure is intense and can be very stressful. So I spanned Software engineering, training, technical support and back to software engineering. Todo all these jobs I have accumulated a large library that beats my local IT library. My advice is to read a lot of books specially about algorithm and patterns, operating systems. I don't know about languages but I am sticking to C/C++ and Java. I don't write much programs in my spare time (I have to protect my marriage) except when I write some samll utilities using Java mobile for phones and PDA, nothing big just small useful utilities. I would say the technical support engineer (level 2 and 3) gave me the most experience as I had to learn the internal of the operating system and that knowledge was a tremendous learning experience. Now I am aiming to be a consultant. Amazing after all that I am still happily married :-) Cheers

  102. nurture what's interesting, ignore everything else by rumpsummoner · · Score: 1

    This entire thread is strange to me. I am a musician that funds my hobby by working in computers. I am by no means a master programmer or even terribly proficient. I tend to take on personal projects that need to be completed but that real programmers don't have time to do. I tend to do them with whatever tool seems to be the easiest to do it with. I don't have a CS degree. I don't know a lot of theory; however, every time I take a little project on it gives me a little bit of experience (and often a little piece of re-usable code) and I get better and better at writing clean, useful, and reusable code.

    This thread is strange to me because so many people on here are telling this guy what not to do as if there is a right or wrong way to learn to program instead of offering suggestions. The way I learn is not going to get an operating system written; however, for every one of me there is some guy out there who wants to write his own operating system and is interested in what I find tedious. I guess if I were to compare it to something I would compare it to songwriting. What is the best way to write a song? Some people write songs following a formula or self-imposed or stylistic goal. Some people learn a ton of theory and then try to find new and exciting ways to execute it. Some people write some words about how they hate their girlfriend and then bash a guitar so they can get a new girlfriend with more enhanced breasts. All of them are valid and all of them accomplish exactly what was intended [some with more assistance from alcohol than others]. The trick is in identifying what you want to accomplish and then finding proper motivation to achieve whatever it is you set as a goal.

    Believe it or not, not everyone in the world is the same. Different people want to do different things. What is wrong for one guy is bomb for another. Bagging on languages and platforms is just as stupid as saying Steve Vai is a better guitar player than Hendrix because he's more precise or because he can read music and transcribe insanely complex Zappa songs for guitar. If you ask a different person they'll tell you that Vai has no soul and Hendrix is the definition of it. Just because I think Steve Vai sounds like someone playing scales really fast doesn't mean it is wrong; it just means that I don't get it. It doesn't inspire me. If someone's idea of a kick ass time involves spending months learning the deep inner workings of how code is executed on a computer and accomplishes it by learning how to write a bunch of assembly which they then give away for free, more power to them. If someone else just wants to turn a bunch of xmls generated by some time tracking software into a csv formatted file that their stupid corporate oracle itime software can ingest so they don't have to duplicate work every friday before they go home to play rock music in their band, that's a good time too... for at least one guy I know. Talking smack on either one, however though provoking it may end up being, is usually counter-productive.

    Ghostunit said a few things I disagree with because I don't think telling people what not to do is very useful in this case. What he said at the end though is money. Find something interesting and you won't be able to help but get better as you work on it. The instant you get it done you'll have thought of 10 ways to do it better or faster and those lessons will apply to the feature creep that your little project will undoubtedly get after your coworkers see what you've done and ask you to bolt stuff onto it. You'll do that and build an entirely useful tool which your company will then own because of an agreement you signed when you got hired. They will sell it for millions and then give you a raise that doesn't keep up with inflation. Regardless, you'll get better at writing code which is the point of this whole spiel. If that doesn't sound appealing to you, you can try out some of the other suggestions. You can learn to write something in assembly or lisp if that's what turn

  103. Re:Avoid overly bitter OcamL/Lisp/Eifel freaks on by DragonWriter · · Score: 1
    learn how to do metaprogramming. learn how to write operating systems, compilers, and design languages.
    Any good resources on these you can recommend? Particularly the "learn how to write operating systems" one?
  104. algorithms by Anonymous Coward · · Score: 0

    Do you mean a better programmer as in, better at doing harder problems, or just being more experienced. Look here http://www.inf.bme.hu/contests/tasks/ for interesting and pretty difficult problems