Ask Slashdot: How Do You Make Novice Programmers More Professional?
Slashdot reader peetm describes himself as a software engineer, programmer, lecturer, and old man. But how can he teach the next generation how to code more professionally?
I have to put together a three-hour (maximum) workshop for novice programmers -- people with mostly no formal training and who are probably flying by the seat of their pants (and quite possibly dangerous in doing so). I want to encourage them to think more as a professional developer would. Ideally, I want to give them some sort of practicals to do to articulate and demonstrate this, rather than just "present" stuff on best practices... If you were putting this together, what would you say and include?
This raises the question of not only what you'd teach -- whether it's variable naming, modular programming, test-driven development, or the importance of commenting -- but also how you'd teach it. So leave your best answers in the comments. How do you make novice programmers more professional?
This raises the question of not only what you'd teach -- whether it's variable naming, modular programming, test-driven development, or the importance of commenting -- but also how you'd teach it. So leave your best answers in the comments. How do you make novice programmers more professional?
Let them accumulate experience and wisdom, and when they achieve it then tell them they're too old to work in this field.
In 3 hours you will be able to cover 5 or 6 things in enough detail to really explain them so you need to focus on what you think it i critical for a novice to know. I would start with identifying hat would you have liked to have known when you started out, then list the critical error you see novices make consistently, and then identify any critical skills a novice needs to have. Once you have that list, pick the 5 or 6 you think are the most valuable and over them.
I'm a consultant - I convert gibberish into cash-flow.
Find some good source code for them to study
I've seen a novice programmer produce quite good code. I've also seen a seasoned developer produce code that could only come from a novice.
Teach them to have pride in their work, and do things well or not do them at all.
Unless you start with a very clear definition of what it is that you want to create and the tools and techniques you will use to bring that definition to fruition you are merely hacking, hoping to end up with something that might work. There is nothing magical about decomposing a product definition into achievable, testable and verifiable requirements, but if you lack the discipline to do those things up front your odds of failure increase exponentially.
Your first step needs to be to define "Professional".
Coding standards and best practices vary from company to company and industry to industry.
On the other hand, patterns of thought, like "Think about side effects", carry over, but are frequently too broad to teach in concrete examples.
And stuff like "Show up to work on time, sober and dressed", essential for the professional, shouldn't be taught in classrooms.
Ideally, I want to give them some sort of practicals to do to articulate and demonstrate this, rather than just "present" stuff on best practices...
This raises the question of not only what you'd teach -- whether it's variable naming, modular programming, test-driven development, or the importance of commenting -- but also how you'd teach it.
I think this is already going down the wrong path. Those are just technical skills and practices that will be picked up over time, and some kind of workshop isn't really the place to learn them imo.
The important differences between a new guy and someone with a decent bit of professional experience under their belt isn't so much in technical skills or adherence to best practices, but it's more of a mindset and general direction thing. Once you've seen a few projects from start to completion, you start to recognize certain patterns and points where things can go really well or really bad. Once you've worked on a bunch of different teams, you start to recognize how different people contribute to a team dynamic and the various ways in which a team functions. You start to understand how your job integrates with the rest of our department and the rest of the business, how the whole management structure works, and what really drives most technical decisions (hint: technical merit is often the last thing driving a decision).
The problem is, you can't really teach that. So I guess my answer would really be very generic "how to be a good employee" type stuff: Take ownership of your problems, check your ego, play well with others, etc. Being a more professional programmer has little imo to do with being a better programmer and more to do with being a better professional. You become a more professional programmer by learning how to have a productive meeting with management about your project, not by learning the magic of continuous integration.
Start with some practical code/app samples that demonstrate clear trouble. Ask them to participate -- see if they can solve the trouble. Then show how the original dev got themselves into that trouble, and the "professional" thing you would have applied to avoid it.
Bonus points for going comedic with examples that are ridiculous to the extreme.
It's important to get a good, sturdy whip to beat your employees with. A good whipping is the only way they'll learn.
Make them read at least some of these books.
You've written such a "course" or you're wanting examples or others to write it for you?
If they are new programmers, probably they need more than just programming skill, they need skill acting like a professional. The Clean Coder does a really good job with that.
For programming skill, I'm going to suggest Zero Bugs and Program Faster. That book tries to change the way people think about code.
On the practical side, there's no substitute for looking at good code. Assuming you're a good programmer, this would mean code review is one method. Have him review your code and find mistakes. He'll think he's trying to catch you, but he'll learn a lot doing it. Then you can review his code, too.
Another good mentoring technique is unit tests. They show you the kinds of things the programmer is thinking about when they test. So you can look over the tests in code review and say, "hey, you forgot to test this aspect." Ideally you'll want him/her to be thinking of every possible test case, even if he/she doesn't actually write out the test.
Another thing is to treat the younger person with respect. Sometimes if you say, "Oh you did that wrong" they will automatically assume, "he hates me" and put themselves in an adversarial stance, which is not helpful for anyone. Look for things that they do that you really respect, and point them out.
"First they came for the slanderers and i said nothing."
I think the main important topics can be derived from the first principal of preparing for change. Being a professions is all about having a system that works despite changing requirements, code and staff.
Version Control: A system for tracking change, and allowing comparisons against the past.
Encapsulation and abstraction: Design such that part of the system can change without effecting other parts. Focus on decision encapsulation: when you have to make a choice, try and minimize the cost of changing that decision: avoiding duplication, encapsulation, abstraction and modularity are tools for this, not goals withing themselves.
Testing: How to make sure your changes meet their goals, as well as how to make sure the changes don't break things.
Documentation: Makes it clear what the code is supposed to do, and when that changes.
Learning: The tools, code, and people are all changing. You must also know when you need to change. This means learn what the options are. Being a professions requires enough general knowledge to know when you should study the details. You workshop should state its goal as help starting this process, which will continue to feed on itself if the developer is dedicated to learning. Learning standard terminology is a good thing to do in this regard, since it makes it easy for the participants to research further if they need to (Ex: tell them what asymptotic complexity is, and when they might want to care and look it up, rather than how to compute it).
I'd emphasize asserts and fail fast and how they help detect inconsistencies, which is your job: hiding inconsistencies just makes your job worse.
I'd spend the end (or maybe more) of the session doing a code review to try and get people to spot areas for improvement in some provided code that aligns with what was covered during the rest of the session (bad/missing tests, needed docs, needless complexity, duplicated decisions etc). That will give people a chance to try and apply what they learned, and be shown cases they miss to let them know their personal weaknesses. be sure to discuss problems in terms of what problems they will cause (making future change difficult for example) rather than rules they violate (ex: duplication). Code review also replicates an important industry procedure that a lot of armatures don't have experience with.
Three hours won't do much for coding skills. Reading style(9) is a good idea. And so would be a few minutes on naming.
With the extreme constraints of the topic, I think a good topic would be proving code is correct. Talk about logical proof, and how it can often be very hard, and how to write software to verify that the code does not fail with normal input. And then, how to verify correct behavior against abnormal input. If coders would write software to attack their own code, I think they will benefit greatly.
A dingo ate my sig...
Beatings.
No college degree, self taught Z80 assembler. Long story short, marketing found out I wrote space invaders for an 8080 based 1553 bus protocol analyzer. Took it to trade shows. Management found out, took me from tech to engineer. As an engineer I wrote code for various hardware. The rule was, when a bug came in you had to fix it. No matter how long ago it was, you owned it.
Quickly learned how to write good code that I could understand a year after release.
Might be worthwhile to talk about the importance of using specs
As someone who has gone from dozens of projects that I never finished, to working on a professional level and writing production applications: the biggest piece of advice I wished someone had given younger me was the importance of writing a good functional spec (or at least adhering to one)
Maybe it's super obvious to everyone else or people who had the luxury of formal education (and ofc anyone who has read Joel Spolsky's classic blog series on specs) but writing a spec is damn near the most important step towards finishing a project in a predictable manner and avoiding scope creep.
Just my 2 cents..
> Teach them to have pride in their work, and do things well or not do them
With just three hours, if it's not three hours every month, I think this is on the right track. In limited time, you may get the best bang for the buck teaching them how (and why!) to learn rather than teaching technical details.
You can present things like code review (peer review) and automated tools that look for code smells. The dangers of stackoverflow.com and how to know which answers are good.
First, however, you need the WHY. Why should they write better code? Why should they care? I'm known for pointing out how much time and energy we spend "putting out fires" and suggesting instead that we fireproof things up front. I'm all about avoiding having pagers go off on the weekend.
People do things because a) they want to and b) they can. If you just present a skill or tool, they *can* use it, but they won't unless they *want* to. What pain they currently experience can be relieved by following your suggestions?
A topic I would mention is how to approach or structure fixing bugs or extending a large, established code base full of warts.
Find a lesser-quality open source project and discuss what improvements might be made to the structure and overall design decisions. Then have them implement them. Bonus: Have them or another group re-evaluate their work once it's done or when the curriculum ends. Best way to learn is to look at a lot of code.
- Classroom discussions will help you get acquainted the new people and them with you & other employees. Written guidelines & practices can act as subject lines for discussion. You don't have to use existing SOPs. Keep it all light & flexible between each newcomer's briefing. Three hours should be sufficient time. Do not forget the coffee & donuts.
Mentors can do far more than a book or course. Teach them to rely on successful mentors.
Professionalism is some mixture of attitude and effort.
If a programmer has a willing attitude, and puts in a good effort, the competence will come with time.
No matter how competent, a programmer whose attitude is lacking, or whose effort is lacking will hinder whatever project they're a part of.
As for building competence, I really liked "Code Complete"
Plop down a copy of McConnell's "Code Complete" and a copy of Martin's "The Clean Coder" in front of each of them and say to them (in your best Samuel L. Jackson voice) "Start reading, muthafuckaz!"
First I would get them to support someone else's code. That would teach them the importance of logging.
Second I would get them to fix someone else's bugs. That would teach them the importance of testing before release.
Third I would get them to extend someone else's application. That would teach them the importance of modular programming.
Classes are great for learning some initial technical skill, but mastery is best learned through real-life experience.
Explain to them why they should use tabs for indentation and spaces for alignment?
The real "Libtards" are the Libertarians!
1. tell them they need to learn constantly
2. introduce them to resources where they can learn from. Good books, online tutorials, youtube videos, anything relevant
3. the hardest: build self expectations in them. So they feel bad about submitting shady code.
Look at how the best private schools educate the best students.
Good hardware, good software, great teachers, a good environment to learn, help with computer tasks that build on many years of quality math and science education.
Private schools build on math, art, CS classes over years. The student is then full prepared for quality private higher education.
Once graduated such people are fully ready for the work force and have the connections to find work they enjoy.
Thats years of quality math and science education thats lacking from people with no formal training.
The ability to study is also lacking. The needed environment to study may also be lacking.
Try teaching a history of math and science for a while first. Get your students ready to study with a history of science, maths.
Then add a lot more useful math that will help with todays complex computer issues. Finally add in Ada or Pascal or BASIC. Such languages introduced generations to computers and allowed them to study.
Finally add todays professional computer software and build on some math skills.
Why are past generation so good with computers? They studied math.
Domestic spying is now "Benign Information Gathering"
That isn't the real world. You rarely know all the variables, and rarely have a customer who knows exactly what they want before the code is written.
"Unless you start with a very clear definition"... no, you can't dictate the expertise of the customer, the perfection of the requirements, or your ability to write a bug free spec when you can't write bug free code. It doesn't make you a hacker to be flexible.
If you want to code well don't bother with a university. You either can or you can't, and universities teach outdated programming concepts.
If you want to get a math, physics, or electrical engineering degree that is copacetic but stay away from computer "science".
Next article, how can I make a baby walk like an adult
How about paying proper experienced people, and put them orienting your newbies?
make them work on code they wrote a year ago.
A good private university gives the person decades of connections to find a good job.
Its also showing the world a person can study outdated or any new programming concepts.
Domestic spying is now "Benign Information Gathering"
Experience
My first response: was teach them effective collaboration strategies, but in 3 hrs?! about all you can do in 3 hrs is show them how much they don't know. 3 hours isn't enough time, imho, to do anything BUT "present stuff on best practices". That is, if you're looking for optimum use of time, 3 hours isn't really enough time to cover even the basics in detail, even in a bullet point/ machine gun/lecture format. Some have already commented that the NONTECHNICAL aspects of being a professional are important and it might help to spend 30-45 minutes defining for them what in your opinion a "professional" knows and does that a non-pro often doesn't. Whether that's work hours, salary expectations/negotiations, not showing up for work unprepared to DO work, inhospitable demeanor/behavior, work-life balance, continuing ed, dealing with difficult peers or bosses, hostile work environments, or what, is up to you. The OP doesn't specify whether this seminar is for a single company or for novices going on to various different environments with a broad range of expectations, there is rarely a one size fits all approach. Perhaps a discussion on the way A.I. is going to change what pros will be expected to do would also be helpful. (by my estimate, that's more like 3 hrs than 30 minutes right there). So, I agree with others that handing out a bibliography / reference notes is a great idea, and it would be very helpful if the books were categorized as to their major utility/focus (keywords like OOP, specifications, etc.). I think the OP has a major flaw, in that it presumes that "novice programmers" will all begin their professional careers in jobs which are uniform enough for any but very vague technical guidelines to be useful. Anyway, there already are such guidelines for what a programmer (with a BS) is expected to know.
USMC bootcamp
I find that most young developers are very good at listening and remembering good advise. What most of them need are hours of practice.
Teach them to better comment and document their work. Code should be written for humans just as much as it's written for machines.
He could reside in "flyover country". https://www.wired.com/2017/03/...
I think you meant begs the question. Saying it, "raises the question" is pretty dated phrasing.
Programmers come from schooling or self-thought with very bad habits because their teachers are clueless.
Point 1: they are making a business asset not hacking together something for themselves or a class assignment.
Point 2: they need to follow documented company coding standards. originality here is not helpful or productive.
Point 3: their code will live beyond them and be subjected to multiple modifications over its life. It must be written to be modified with that in mind.
Point 4: Towards 3, it must be written to be read. Another programmer should be able to read and understand its function quickly. So the code should be written for readability and to be understood rather than to show off. Comments should all any the question why? not what? Variable names should be clear and helpful, follow defined coding standards, and be correctly typed not just within the language itslef but the variable's use. Ordinal and cardinal numbers are different things.
Point 5: Explain that textbook examples were written by those who teach not those that do. Give them examples of the best code produced.
Point 6: Make them critical of their own code and push the idea of craftsmanship. A spelling error or typo in a comment is an indication that the code has not been read after being written so there probably is a bug there somewhere.
Point 7: The Psychology of Computer Programming is a classic text. Producing good code is not an individual activity. All code should be subject to a peer structured walkthrough. Every programmer needs to give their best not just as a coder but also as a reviewer of others code.
THEN you can start coding here, kid.
How do you make experienced programmers more professional?
What he's really asking is "How do I make a millenial not".
Once you find the answer to that, my friend, please come back and tell the rest of us.
Why would anyone want to be a professional programmer if that is what it is all about? It doesn't sound particularly fun or challenging. It sounds like more like something out of 1984 or Brazil. I like to code because it is fun to build a machine--a sort of intricate wind up toy--that you actually get to run eventually. What you describe sounds more like being a slave. I guess I can see why they have to pay so much or go to India. That's not how I would want to live my life. Do these 'professional' programmers have high rates of suicide?
Quite an experience to live in fear, isn't it? That's what it is to be a slave.
First, read this: http://kotaku.com/5975610/the-...
That is an analysis of the coding style used in the Doom 3 source code
Next, read this: ftp://ftp.idsoftware.com/idstu...
It is linked within the first article, but it is important enough to directly reference. It is id Software's official programming guidelines. Seriously, just having clean, clear, consistent guidelines for source code makes a world of difference in quality.
The very first thing to teach young'ns is this:
"Programs must be written for people to read, and only incidentally for machines to execute."
Found the slob. Or crazy feminist. Or.... both.
Accept that this isn't a single tutorial, but a continuous process of teaching and learning. And failing! Here's some tips I recommend:
1. Don't dump every best practice you can on them at once.
2. As you see individuals demonstrate these skills, have them present it to the group.
3. Use code reviews so that they are motivated to catch each others mistakes during reviews, then are motivated to not make those mistakes themselves.
4. Have senior members of the team demonstrate these practices and participate in reviews and mentorship.
5. Assign them work that will improve their best practices. Maybe cleaning up an existing module, documenting a particularly difficult area, or reading a chapter in a book and finding an example in your code base where it could have been applied.
6. Accept commentary and debate. There are always exceptions.
Most companies have some kind of code review process. This helps new engineers sharpen their skills through feedback, and familiarity of code not written by themselves.
Take 100 novice programmers, have them work for 10 years. If there are any left that you didn't have to fire, there's your professional.
> For programming skill, I'm going to suggest Zero Bugs and Program Faster
I second that, good book. Specifically it's a collection of good ideas, each of which takes about ten minutes to read. Zero Bugs and Program Faster would be an excellent choice if you want to spend just a few minutes each day, to have continuous slow improvement. It was my bathroom reading for a while and it was perfect for that.
(If you assembled the top 50 best forum posts related to creating robust software, you'd end up with something like this book - about 50 seperate good ideas that are only loosely related.)
Another way to use that book would be to read the same short section each day for a week, so by the end of the week the idea has found a permanent home in your brain.
Coding standards documentation, Peer review of their code and gated checkins. They either learn to be more professional or they quickly are identified as someone you don't want and you do that as an educational experience, it is ok to make a mistakes as long as you aren't repeatedly making the same ones.
How do you become a more professional programmer when your full time job isn't programming?
I was a video game tester for six years, went back to school to get an A.S. degree in computer programming, and got into IT support because I enjoy the work. I program at home (Python and web development) and occasionally write PowerShell scripts at work, but the only time I deal with other programmers is when I'm cleaning up their messes over the network at work.
BTW, Microsoft SharePoint IS NOT a proper bug tracking tool.
1. Writing code means you have already failed
2. The more code you write the more you fail
3. Failing is bad, don't fail.
4. You don't need to fail to learn that failing is not good.
5. The non-programmer guy in the backroom who is a domain expert in whatever your software is supposed to do is more qualified to do your job than you as a "programmer" will ever be.
6. Progress is the process of circular "rediscovery" of concepts well understood by others long before you were born.
7. Software industry is driven by viral propagation of temporary fads completely disconnected from merit.
8. The better your tools the better your chances of being fooled by them.
9. DSLs are always better than general purpose languages.
10. Never work more than a 40 hour week for any reason.
I've been a developer since I was a child. I became a software engineer after education. I have been a senior developer on at least 3 projects that have impacted a billion or more people for 5-10 years and have a list of "inventions" to my name that is quite long.
:
I am not properly educated. I couldn't afford to attend the university in America, so instead, I latched on to the head of science and engineering at a major university and traded work for books etc... but I received no paper. I was forced to know every book verbatim at all times for years because in order to work in generally Ph.D. level positions and be taken seriously, I had to be a walking reference at all times. It was a bumpy road, and I got my scars, but I made it.
I become a structure zealot. I became absolutely obsessed with Big-O, data structures in general, design patterns, etc... I rarely if ever wrote a piece of code without obsessing over its design extensively before doing it. I learned that all the best programming started on the backs of napkins at coffee shops. A local coffee shop even let me and a colleague use white board markers on their windows for an hour or two each day because we were costing them a fortune in napkins they said. We often had an audience, less professional developers wanting to learn how to plan and employ complex things.
Together my colleague and I reinvented methods of programming such as methods of decoding images using a push pipeline rather than simply a FIFO by designing state machines similar to VHDL coding that would decode and display pixel by pixel of an image (jpeg, png, gif) as soon as the data was available. We designed new methods of compiling lex and yacc grammars that would dispense of tables and handle contexts while also processing data as it arrives based on state machines and make corrections if new data changes the meaning of older data. We wrote memory allocators, just-in-time compilers (back before they were properly named).
None of these tasks could have been accomplished without
1) Education
2) Reading to further education
3) A thorough understanding of computers (we were both demo coders when that meant something)
4) Math
5) Patience
6) Respect for each other instead of competition.
Now, I've gotten old and I decided I liked money a lot, so I left my job as a programmer after nearly 20 years and moved onto being an network instructor. First of all, networking people are all very similar to informally trained programmers. They're typically more talk and less real knowledge. They spout off things they don't fully understand and they often find them to be mysterious and amazing. They learn a new acronym like HSM and even learn it means Hierarchical State Machine and before you know it, your code is littered with chaotic amounts of junk because every problem they try to solve, they employ their new toy to solve. Sadly, it's not magical and they make coding changes that will permanently impede your ability to work professionally since training new programmers on the project will now take 3 times as long.
Let's start with a few bullet points
1) New languages can bring new methods, but new languages come and go
PERL, PHP, Ruby, Python, what's next?
Due to children making decisions all the time, there are companies with millions of likes of bad PERL, PHP, Ruby and Python code out there. Each time there's a new "hot language" we end up rewriting absolutely everything over and over and get it wrong over and over. Those languages are great for some reasons, but while I use Python once in a while, I generally limit how much I use it since I expect support to slowly taper off within 3-5 years. I may be wrong, but it's a "language of the week" and I don't believe in investing in languages of the week.
2) Communication is the absolutely most important thing
Algorithms, Desi
As you said, the common way of getting software requirements doesn't work too well, and certainly doesn't work *reliably*.
I have a book from the 1970s that describes many of the programs I use every week. They still serve the requirements 40 years later. I'll come back to that set of programs, and how they predicted requirements 40 years down the road, at the end of my post.
Before getting to the 40 year old programs that are still used daily around the world, this topic reminds me of one of the best software design tips that I've been taught. In retrospect it seems obvious, but many programmers haven't thought to do it, and most don't insist on doing it.
90% of the time, you're writing software to better do something that's currently being done some other way. Perhaps you're replacing legacy software, perhaps it's currently being done "manually", people entering data one item at a time. Perhaps you're replacing a paper-based system. Most of the time, you're replacing *some* method of doing the same task.
It logically follows, then, that to fully understand the process, it's requirements and idiosyncrasies, you can watch the people actually doing it. Even better, have them show you how they do it, then try to do the job yourself while they watch and correct you or point out things to be careful of. Take notes during this. Most likely, the way they are using the old system is NOT how it was designed to be used, because the designers of the old system weren't clear on the requirements. But users find a way of meeting their requirements. Watching how they do that shows you what they actually need to get their job done.
Already just by watching them do the task you'll understand the requirements far better than you would by having a meeting with their boss's boss (the common, bad, way to get requirements). After watching them do the task, next ask them two questions:
What about the current process or tools is frustrating for you, or slows you down?
Pretending *anything* is possible, what would your impossible wishes be for this?
The second question often elicits ideas that allow the programmer to say "I can do that, that's easy". Then you begin to glow with heavenly lights because they thought their wish couldn't possibly be granted. Truly, I've done EASY programming tasks that have garnered me a reputation for being able to do the impossible, simply by asking the users what impossible features they wish I could provide. Their conception of what's easy and what's impossible is totally unrelated to what a good programmer can actually do. (You've probably noticed users often think it should be easy for us to do something that's actually nearly impossible. The flip side of that same ignorance is that they think we can't do stuff that we can actually do pretty easily.)
I didn't come up with any of this myself, these aren't my genius ideas and I wouldn't expect anyone else to think of these things. These are things I've been taught along the way, and I wouldn't expect another programmer to think of them, until they are also taught these ideas.
One more thought, or set of thoughts about foreseeing requirements. I was also taught that you can, fairly easily, plan for and program for future requirements without knowing what those future requirements will be. There are two major ways of doing that, both closely related. One is to avoid hardcoding unnecessary limitations. As an example, configuration for my software never has the user provide a configuration value. Instead, each configuration item is a LIST. If my software can send email notifications, it isn't configured with an email address to send to, it's configured with a list of email addreses. If it can read from a data file, it can read from a list of data files, etc. In the code, the added flexibility requires just this additional code:
foreach {
}
That's it. Just "foreach" whenever a configured value is used makes the whole system far more flexible. This is an example of not ar
Send them on a Computer Science degree course. ... or maybe you're one of those people that would be happy if your surgeon turns out to actually be a plumber that just felt like having a go at surgery after watching a youtube video.
Its clueless to think that programming to a professional level is something you can learn in a few hours.
Say what you will about it, I've found pair programming a strong Sr. level developer with a junior one of the fastest way to improve the junior's skills.
> First of all, I have an issue in using the concept of "professional programmer"
Professional programmer, noun, someone who has made programming their primary CAREER and has a recognized formal education.
In contradistinction to Amateur, noun, someone who has no formal training, and may, or may not do the job better. Programming is NOT their primary career.
>> For programming skill, I'm going to suggest Zero Bugs and Program Faster
> I second that, good book.
I'll third that book. Great book !
A) You don't know what to teach, so you should be teaching. /. to achieve your retirement objectives, further proving you shouldn't be speaking on programming.
B) You're trying to build coursework by asking
A comment my father used to make that took me a long time to fully understand was "Sure, bang it in with a wrench." That is, a true craftsman doesn't use a wrench as a hammer: they use the right tool for the job.
Novice programmers typically choose the wrong "tool" (language, library, design, algorithm, etc) because they're not even aware of the right tool - writing a complex graphical interface program entirely in Perl because that's all they know.
Intermediate programmers typically choose the wrong tool because they want to grow beyond their current job - writing all the company's shell scripts in assembly because they want to learn assembly.
Advanced programmers typically choose the wrong tool because they want to show off how smart they are - implementing core functionality in a language they designed themselves so they can brag about it to their friends.
Ultimately, in a professional settings you want simple solutions to hard problems. Code that's easy to understand, easy to debug, easy to modify. Of course, too often you get the opposite: complicated solutions to easy problems. :)
For the novice programmers, the path to becoming a better programmer is simple but time consuming: learn about all the different tools that are available and when, and when not, to use them. Having your own hobby project on the side is very good for this.
For intermediate programmers, having your own hobby projects is also good - better to write your own little open source device driver in assemby than the company shell scripts if you want to learn assembly.
But for advanced programmers, the path to becoming a better programmer is more difficult. Essentially, you have to let go of trying to prove to the world just how smart you are. John Cleese got into psychology after Monty Python and wrote a very nice book "Life and How to Survive It" about how to be a "gold medalist of mental health". He's also got an excellent YouTube video on creativity, for example
I'm pretty sure you won't teach them a lot in three hours. Maybe some very basic concept, something they could learn on their own (and faster) in a CS introductory book. I think you could achieve more trying to inspire them. Programming is great, programming is the making of worlds by your own hands, when you code you are a small-scale god. Next, tell them about coding horror stories, team stories, pitfalls, let them think that CS learning is needed and worthy. Show them there are giants whose shoulders they can climb and reach farther than they could. The movie "Invictus" has a scene when Mandela talks to the team leader:
- Nelson Mandela: How do you inspire your team to do their best?
- Francois Pienaar: By example. I've always thought to lead by example, sir.
- Nelson Mandela: Well, that is right. That is exactly right. But how do we get them to be better then they think they CAN be? That is very difficult, I find. Inspiration, perhaps. How do we inspire ourselves to greatness when nothing less will do? How do we inspire everyone around us? I sometimes think it is by using the work of others.
Its the old programmers who haven't learned a thing in 20 years, and who will never change.
http://michaelsmith.id.au
NO.
Tell them to go into Web Development.
Then be hired by Slashdot. Then create with a Slashdot site that doesn't jump up and down like a God Damned Fucking spastic French Poodle when you are trying to read/post/moderate the fucking articles.
Based on how Slashdot pages are behaving, they don't even have trained monkeys working for them, but rather drooling, hydrocephalic, brain damaged shit heads that delight in ruining any web page they can smear their feces on.
HOLY FUCKING SHIT Slashdot!!!!
WHAT THEY FUCK????
When Fascism comes to America, it will call itself Anti-Fascism, and tell you to give up your guns.
There are several pre-conceived notions about programmers.
1) You are born with some sort of aspergers syndrom that makes you super human with code
2) Your inability to socialize makes you super human with code
Both of these are false.
A programmer grows like a plant with layer upon small layer of knowledge and experience. It takes a hell of an investment in time and a very particular personality which is hungry for the knowledge and constantly reaches out for more.
There is no secret sauce, there is no steroid you can give a person to make them a faster stronger programmer.
Team code reviews.
Make certain that everyone does it. Do not let anyone know in advance, just review all the code that was checked in last week. Don't let the actual programmer explain it. The coder sits on the sidelines during reviews. Teams of 4 people. Turns out that 3 reviewers is the optimal for uncovering mistakes, assuming they actually LOOK at the code and critique it.
I worked in a place that did formal code reviews. Took about 8 months to turn someone who didn't know the language into an expert. Yes, there are gaps in knowledge. There are always gaps. Nothing can fix those except time and experience.
But reviewing code - both great code and not-so-great code - is good for everyone.
You can't teach good programming in a seminar, though you can teach some basics (Goto's considered harmful, think objects, etc.).
You show how it's done, get the apprentice to do some, then criticize their work.
I interview and train all new hires to our department. A new hire consumes about 20% of my time per week for the first two months and 10% the next four months thereafter. When we hire its a commitment and intend to see our new coworker successful. Some tips:
1) Assign recent but already solved problems. See how they solve it. Make corrections along the way, and on rare occasion, they'll think of something the team didn't.
2) Have them create a small internal tool that will benefit the team. It should not be mission critical but it should be used daily and they WILL be responsible for it.
3) Give them current production code and ask "what would you improve / change here?". Take out the author of the code name. Point out where their logic is sound, and, where its not.
4) Explain project management, politics and business issues as they come up in those first six months.
5) Go out and have some drinks with the person after hours on a handful of occasions for items that cannot be discussed in the office.
For those wondering if this is too much hand-holding, no its not. This is an investment we fully intend to make the most out of. The personal time spent ensures the new hire doesn't walk out the door in the first two years, and, fewer mistakes are made once they are assigned real work. End of the day - we do get a return on the investment.
Stuff like "Code Complete", that don't explain how to write code, but how to write code so it's readable, understandable, debuggable and maintainable.
Agree. The jank is insane on these pages.
The problem solving is the challenge and why does it have to be fun? What is fun anyway? Would you really want a surgeon or policeman to look for their job to be fun? Craftsmen get satisfaction from building something that works elegantly. Having self-pleasuring "fun" and "being creative and artistic" is what generates the crap software the rest of the world needs to deal with.
Whiny bitch comments like this are unprofessional. I'm guessing you're a novice programmer and amateur troll.
Nothing teaches people more about writing code than actually writing code. Given novice developers' hesitance to throw away code they've written that works, iteratively walk them through some "real life" crazy requirements changes, and then talk about the monsters they wrote and how they evolved. I like 30m iterations. Highlight some of your favourite practices as incidentals (ie. hey, that's a nifty comment but now it's a lie, what if you'd commented why instead of what?, or hey, that function called "do the thing" doesn't actually "do the thing" does it? How'd that happen?) This gives you (and probably a couple extra) facilitators time to run around the room and see what they put together. It can also be tricky to build up the room as a "safe space" where folks have the courage to share their blunders. But if you pull it off, it's magic.
Demonstrate the value of good practice. The difference between inexperience and experience is the experienced have made the mistakes and seen the consequences of other mistakes. The point of all those software approaches is that they improve end software quality,and medium to longer term improve maintainability and extensiblility of the code. (If they don't achieve any of those, you probably should get rid of the process).
The real problem with inexperienced programmers is they haven't seen the result on a large code base and project of not following good practice. So they can't see the value yet.
Very simply, try and demonstrate the value. Eg two pieces of code, one with poor structure and commenting and one written to a good standard. Have them change some functionality in each and validate the change. The poorly written bit of code will be a pig, the code that is to standard easy and the automated testing will give them a nice little validation of the result. Drive home why the better written code was easier to work with.
It will also let you weed out the really destructive programmers early, the ones that never learn the value of good coding practice.
Here's a suggestion for a framework for a talk I think people might find interesting. Focus on process and use two examples: one success and one failure. Start with the problem you were trying to solve and show how the code evolved, explaining both the technical and organizational issues that led to the success/failure. Make it visual (show the code) and temporal (go through the timeline of development). Throw in plenty of light jabs at management to add levity. Cover all your pet peaves but don't get stuck on one for too long. What the hell do I know, you're the lecturer.
no facebook, unless you are zuch bitch and a complete retard
no girlfriend, unless she is also a programmer and aid you reading the fucking linux kernel
no games, unless you are an aspiring artificial intelligence analyst
no drugs, unless it's mariujuana. seriously hemp is okay compared with coke
no jokes, because you must wath monty pyhon to know the jargoons, not behave like a clown
Make sure the programmers add comments to each section that does different things, especially when collaborating. Nothing worse than editing a script file and then another guy changes a bunch of variables with no explanation. Also, have a debugger handy as soon as possible. Even if you're using something like Bash, Python, Java, make sure to have it echo or print out variables as it runs. You can use a special comment like "#DebugEcho" beside them to find and clear them out latter. Also, GitHub is the king of collaboration. I think private projects cost money, but are free to students. I got an account, but it's been a while since I signed up. I did it originally for the free Unreal Engine. And for the love of god Githubbers, please include a configure file for source compiling. I'm sick of getting M4 errors trying to make one. I guess another point to touch on is to test your code on as many platforms as possible. Not all Linux behaves the same if that's your target. If it's not, don't talk me. Hahaha....
Install Doxygen. Let them see how crappy their code looks and show them how to fix it.
The problem is that our industry, unlike every other single industry except acting and modeling (and note neither are known for "intelligence") worship at the altar of youth. I don't know the number of people I've encountered who tell me that by being older, my experience is worthless since all the stuff I've learned has become obsolete.
This, despite the fact that the dominant operating systems used in most systems is based on an operating system that is nearly 50 years old, the "new" features being added to many "modern" languages are really concepts from languages that are between 50 and 60 years old or older, and most of the concepts we bandy about as cutting edge were developed from 20 to 50 years ago.
It also doesn't help that the youth whose accomplishments we worship usually get concepts wrong. I don't know the number of times I've seen someone claim code was refactored along some new-fangled "improvement" over an "outdated" design pattern who wrote objects that bare no resemblance to the pattern they claim to be following. (In the case above, the classes they used included "modules" and "models", neither which are part of the VIPER backronym.) And when I indicate that the "massive view controller" problem often represents a misunderstanding as to what constitutes a model and what constitutes a view, I'm told that I have no idea what I'm talking about--despite having more experience than the critic has been alive, and despite graduating from Caltech--meaning I'm probably not a complete idiot.)
Our industry is rife with arrogance, and often the arrogance of the young and inexperienced. Our industry seems to value "cowboys" despite doing everything it can (with the management technique "flavor of the month") to stop "cowboys." Our industry is agist, sexist, one where the blind leads the blind, and seminal works attempting to understand the problem of development go ignored.
How many of you have seen code which seems developed using "design pattern" roulette? Don't know what you're doing? Spin the wheel!
Ours is also one of the fewest industries based on scientific research which blatantly ignores the research, unless it is popularized in shallow books which rarely explore anything in depth. We have a constant churn of technologies which are often pointless, introducing new languages using extreme hype which is often unwarranted as those languages seldom expand beyond a basic domain representing a subset of LISP. I can't think of a single developer I've met professionally who belong to the ACM or to IEEE, and when they run into an interesting problem tend to search Github or Stack Overflow, even when it is a basic algorithm problem. (I've met programmers with years of experience who couldn't write code to maintain a linked list.)
So what do we do?
Beats the hell out of me. You cannot teach if your audience revels in its ignorance and doesn't
I cracked open a dictionary and now it's broken. Imma crack open ya head now, nigga. You owe me a dictionary.
Professional programmer, noun, someone who has made programming their primary CAREER and has a recognized formal education.
There is no need to have a recognised formal education to be a good developer (although it sometimes helps you get your first graduate junior developer job). Far more useful is a few years spent contributing to open source projects and getting used to getting your code reviewed.
Once you have been programming professionally for a few years it is all about your previous roles, nobody gives two hoots about your academic background if you ace the interviews, do well on the technical tests and have at least 2 or 3 years solid commercial experience.
I dont read
Two of the essentials, anyway. Not enough by themselves, but necessary.
make everyone use git or similar, and have all merge requests reviewed by coders who are both willing and capable of explaining what's wrong with the submitted code AND offer pertinent, targeted suggestions for fixes and improvements.
a code review without learnable critique is next to useless. it's not an opportunity to say "fuck off, your code is shit", it's an opportunity to teach and encourage improvement in your colleagues.
This helps the more experienced coders to improve too - explaining something to someone else is a great way to enhance your own understanding.
No. You can learn them whelps good programmin' praktice with a 3-hour corporate seminar. None of this Malcolm Gladwell ten-thousand hours of practice "stuff."
Programmin' talent comes in a can!
That's funny; as I wrote that it didn't occur to me we used to have physical devices called pagers, though they were actually pagees (they got paged). I was thinking of thr monitoring systems that page people.
They're going like gang busters to try to each every kid how to code. I've suggested they focus on number systems like base 2, base 8, base 16. If they can handle that then you start with Boolean logic. Then open source software - python for example. It's a simple but very powerful language.
That Boolean thing is clutch though - once you understand that you're pretty much good to go. And of course some critical thinking is in order too.
You teach them. Nobody has taught three generations at this point how to be functional human beings, it ties directly into that, and for students, it is equally easy: you become willing to learn, even if said learning is the only reward you ever get for it. There are no techniques, 'life hacks', webinars , or other bullshit involved or required. Sit your asses down and *listen* for a change.
Aesthetics allows us to distinguish "I wouldn't have done it that way" from "That's garbage."
Emotional intelligence lets us use the insight and experience of the rest of the team.
See http://www.elfsternberg.com/2016/12/26/care-code-quality/
http://www.elfsternberg.com/2016/08/13/programmers-class-aesthetics/
http://corgibytes.com/blog/2016/09/15/three-influential-books/
http://arlobelshee.com/gender-bias-in-my-hiring-history/
...but they'll never see the light of day on /. Too many smart-ass wannabees flinging their feces at others...and likely to "not want to be bothered" with pre-coding design, or meaningful comments, or a "design document" prior to writing code against which the final result can be compared...and frequently updated.
Having been a programmer since 1961, I have developed lots of skills in teaching others. Having a trusted mentor is vital...someone with whom one can have a discussion, in-the-moment, about how to make decisions like "top-down" vs. "bottom-up." About leaving a trail of explanations "why" both in the code, and in all supporting documents. Good basic foundation in the principles of programming, irrespective of language, like Bohm-Jacopini...and it's variants. Practicing how to visualize a nascent program in execution, at multiple levels of granularity. All are essential...and I've probably missed a few.
Take away their cumputers so that they cannot master bait with it.
What they need is experiences. The most hated thing in programming. Tell them to do their company a favor and don't go with the flavor of the day.
Usability. Performance. Maintenance. Automated tests. These 5 are most important. But it doesn't hurt to know basic math also.
First off, get an education, then stop going for jobs outside of an environment that YOU and shortsightedness have messed up. Stop lying. While you claim your name as Peet, we bet your colleagues address you as venkat, muthu, or shrini. There was an article some time ago about how some in a certain culture have the right to :cheat, steal, and lie all in order to perpetuate their well being, all of which derived from the statement " we have been discriminated for too long." I am not racially discriminant, but when unnecessary immigrant aggression is present within any argument, I find it hard to be sympathetic. I say welcome to California, thanks for coming by and leaving your refuse, now go home..
Programmers love to program. However, the best software comes from more thinking and less programming.
That your comment, and its grandparent, have been modded to -1, and the parent to +2, explains all too much about the poor quality of software.
You help someone progress from an amateur mentality to a professional one by holding them to higher standards of work quality. This means that a programming project is properly planned out before a single line of code is written; whereas amateurs just dive in a make a mess of it. Program structure and comments are inputted logically as courtesy to your team members and others who will work on the program in the future. Additionally, there's a focus on doing the job right, rather than just diving in and hacking away until it works.
Don't teach them coding. Teach them how to engineer code. It's the difference between slapping something together and building something from a good plan. It's the difference between building something and hoping it'll work, and doing the math first so you KNOW it'll work.
Any large professional project needs a good plan or it'll fail. That's the difference between an amateur and a professional, at least to me.
Familiarity with specific fields of mathematics semantics is not the same thing as programming skill.
A good programmer can solve problems algorithmically, whether or not they know common mathematical symbol semantics. I know quite a few excellent programmers whose mathematics skills were limited not by intelligence, but by school systems that had gym teachers teaching high school algebra classes in rural communities to make extra money. Negative bonus points for those programming nerds who were bad in gym class.
Please do not read this sig. Thank you.
I've been in this business for over 20 years, and I think I can honestly say that seeing my own code from one year ago, every single year, would cause me to sigh and think: "I was so naive then..."
But anyway, I wrote this book, just follow it and you'll be a professional programmer after you finished reading it...
Look, if you have to ask these types of questions here, YOU ARE NOT THE RIGHT PERSON FOR THIS TASK AND NOT QUALIFIED TO BE IN THIS POSITION. Stand aside and get qualified staff to do so..Otherwise as stated in previous comments, go home.. You cant treat Novices like pro's, quit setting unrealistic expectations. You cant teach if you dont know your subject as obviously illustrated through out the article. Blind leading the blind.Stoopid, leading the stoopid, while being stoopid.. Whats even worse, is now this individual will go out and poison the minds of a small group of individuals, all of which will FAIL, which leads me to ask "was it worth it". Person wastes time teaching a subject they do not know to people whom do not know enough to question, because there are no questions the company thinks the teacher has done their job and thus is compensated for poisoning said minds.. I would also venture to say consult your teachers/professors, to which we conjecture you dont have any which is why your filling up /. with this crap. Whats even worse the DICE EDITORS on /. allowed this crap to surface.
the vicious circle of eyes n teeth. Dont ya just love eroding credibility??
Ask them to write some code. Then ask them to change/maintain it. Expose them to real-life code maintenance.
There are a few signs that show the professional developer, such as wearing a tie.
http://www.ties.com/how-to-tie-a-tie/windsor
The biggest weakness I see amongst new developers is naive approach to programming resulting from what the learn in tutorials.
The may have a good appreciate of the intricacies of the various API or libraries in question. However they complete ignore real life best practice when using them. They ignore a proper separation of concerns. The will implement three versions of the same function each with a minor differences. They will write unit tests after the fact, rather recognise they are for test DRIVEN development.
Fucktard,
you got the education you needed, bottom line. I dont see you reaching out to the community for completion of a paid project, showing your obvious ignorance..
As you exemplified, there was a lacking in your education, you sought out the right person for the right job. To that, what's this guys employer's excuse in this situation? Leveraging some peon at the lowest wages in the department, to teach everyone else???
Really??
At this point I am struggling understand the relevance of your argument as presented..
Can you help us to understand why the employer will not hire a teacher, send the students to a professionally taught workshop, or university satellite training? (all of which may be cost effective)
Mod that one.. :)
Boundaries. Both personal and professional. While both ingenuity and good work ethics are essential, they need to know that there are some rules set out by people who are just as smart, but who have a lot more experience.
Any guest worker system is indistinguishable from indentured servitude.
It's always the basics that get people in trouble:
- use Object Oriented logic. Why are you writing procedurally and calling it OOPs?
-- modularize. Stop trying to make your favorite framework do everything
- don't reinvent the wheel. I have an Automator who is adamant about writing test suite logic for a language that already has it. His does less and he can't articulate why the included functionality isn't sufficient
- iterate. People are waiting on your functionally: get stuff merged and integrated on a regular basis, rather than trying to get everything perfect and complete all at once
Where I work, everyone code reviews each others code. I find this to be the best way to propagate best practices. Novices programmers not only get comments from more experienced programmers but they also review code written by experienced members of the team. Discussions are as important as the initial comments. Code review cuts down significantly on bad habits because it is easier to fix things you know will be caught then to go back and fix them later.
Also we have reviews on code design too. This is done before writing code to prevent rewriting everything that is already submitted.
Your post basically says, "Golly, I don't know what all these big words mean, maybe if I make it up none of these dumb slashdotters will ever have read a dictionary?"
If you're going to engage in a No True Scotsman, at least look up the etymology of Scotsman and make yourself worth correcting.
In facility architecture, there are architects, building programmers, estimators, schedulers, carpenters, bricklayers, plumbers, electricians and general laborers.
In large scale software, there are architects, developers, testers, tool builders, UI specialists, configuration management engineers and so on.
You don't expect the carpenter to do what the plumber or the head architect does. Neither should you expect the tool builder or UI architect to do what the system architect or feature lead does.
Workers in every field have varying levels of skill. Don't expect the scripting guy to suddenly embrace the wonders of the factory pattern. It's not his job and he's not interested.
What a dev lead who's worth a shit should be thinking about is getting the best labor at the cheapest price to get the job done, and stop trying to hire a system architect when a scripting guy will do.
Software is business, not art. Do that on your own time.
Please do not read this sig. Thank you.
Fucktard,
Sorry. I don't know your mother.
At this point I am struggling understand the relevance of your argument as presented.
I could say the same about your comment.
Mod that one.. :)
I could say the same about your comment.
"Now, I've gotten old and I decided I liked money a lot, so I left my job as a programmer after nearly 20 years and moved onto being an network instructor."
Thanks for the interesting programming career story and perspective which obviously reflects a lot of talent, hard work, and success as a software developer. While training is important and well worth doing for lots of reasons, I still don't quite follow from your story how a move to training would pay significantly better than programming?
Example for the US:
https://www.indeed.com/salarie...
"Average [hourly] salary: $17.60 [with the tail going up to around $50]"
Granted, sometimes people run onsite training seminars for tens of trainees for totaling thousands of dollars a day (sometimes less hotel conference room rentals and travel expenses etc.). So maybe that is your angle? But even, say, 50 training sessions a year times $5K each is only $250K gross revenue, less after expenses, and travelling can be tiresome -- so overall still seems iffy to me compared to programming in a well-paying position or on an independent (successful) project.
That said, I've enjoyed the times I've taught other people things related to computers, so I won't deny the general appeal -- especially later in a career.
A 21st century issue: the irony of technologies of abundance in the hands of those still thinking in terms of scarcity.
Have them wear a 3 piece suit.. Well, they believe that that stunt works at the White House!!
That's interesting. I can't quite decide if it's useful or goofy. Maybe both. I've done something similar when it makes sense - very recently in fact.
Once I saw this program, with a whole company based on the program, which accepts absolutely anything as free-form text input, or even voice and pictures. If the input resembles a mathematical expression it returns the result of evaluating the expression. Even math with words like "5 grams in ounces". If you give it a picture as input, it returns similar pictures. If you give it input that resembles an address, it returns a map to that address. This strange program, called Google, has been moderately successful.
Extending your idea a bit, rather than copy-pasting those lines, one could have it as a function get_arg_objects(). Yes, it would be a very short function. The Linux kernel uses very short functions like that, and Linux is a tad successful. In fact, many C, perhaps most, programs use one-line functions like that - they call them macros.
Your code reminds me of a strange function in Perl called wantarray(). It allows your function to return different types, depending on that the caller seems to want. So you can easily handle of these appropriately:
My_number = foo(bar);
My_array_numbers = foo(bar);
foo(bar);
Tell them some really bad stuff could happen...because it will.
You cannot "make" novices professional. They must be driven from within to become professional themselves. A better question would be, "How do you inspire novice programmers to seek knowledge, experience, and proficiency as desperately as they want to breathe?"
The only way to turn someone into a professional is to pay them. A professional, regardless of his skill, is someone who gets paid to do what he does.
The college curriculum is focused on how to get software to work - at all. You do project that are supposed to do things. And you get your program to work, you submit it, and if it passes the tests, it "works"
However in the real world we are no longer concerned with getting software to work. We assume that it will be developed and will eventually be working, through some majority effort of feature-adding and a minor part maintenance, it will be accomplished. But what makes that assumption possible is that good code is written from the start. New developers will write terrible code - but it will work in the average case. To write "good" code, requires an insight into how software fails. Young developers only know how their software fails in the few ways they've been able to encounter because that's all they've seen.
So my proposal is to treat software development like a trade:
Apprentice - Write tests for code for journeyman or master developers. See all the ways that software can work AND FAIL. Minor feature additions, scripting, DevOpsy-stuff. Can write code for limited internal apps, and production systems but only under supervision. Will develop proficiencies with technologies. (AKA Jr Dev)
Journeyman - Armed all the ways the software can fail even by more experienced developers, the engineer is now able to write code for production systems. Unit tests are written by an apprentice. Demerits for when an an apprentice finds a bug. (AKA Sr. Engineer)
Master - this isn't really a thing because Journeymen are expected to move into engineering management -- if they want to.
Slashdot's rate-of-post filter: Preventing you from posting too many great ideas at once.
Lets face it. Software development is a ruined field. It is full of irritating bloviating self-important hotheads who think their way is the only one true way. It is a ruined field of endeavor, because if you think software development requires the discipline of other science and engineering degrees, then why is there no licensing exam? Answer: software development is more art than science or engineering. Because it is more art than science, software development is tribal in nature -- each company nurtures and promotes its own unique way of brewing completed projects.
Make the novice programmers want to improve.
If you do that, all the rest will follow. Fail to do that and you're just pushing a rock uphill. You can get improvement against the novice's will but it will always be difficult and progress will be unsatisfactory.
You've got 3 hours? Inspire them. No lectures, no content, just inspiration. Then at the very end tease them with sources they can follow on their own.
Hit them over the head with Murphy's law.
In other words, make them use, test, debug and fix their own software.
Also make them test and debug other people's software.
My Navy electronics teachers had stores of carefully defective equipment, just for us to troubleshoot and fix.
So, bring some carefully defective software for them to test and debug. Grade them on how many bugs they can get fixed! 8-)
Colleges teach a lot of analysis and design, but little (if any) troubleshooting and repair. (Except in local 2 year technician courses ... maybe.)
But you cannot design like a professional if you cannot see what will go wrong.
Of course, it's harder to grade it... 8-P
Test. Before. Committing. You break the build, you don't go home until it's fixed.
"C'mon, this isn't rocket surgery." - Anon.
I think you can turn someone into a professional programmer in two years.
Step one: make them write some new function or form for your users.
Step two: make them do user support for two months (and rewrite the form as needed)
steps 3-9, make them work on some other programming modules, revising what other people have written.
Step 10: After two years, make them update the form they wrote originally.
I am appalled that this thoughtful and reasonable comment has been moderated down to -1. Maybe Slashdot is a waste of time.
I am sure that there are many other solipsists out there.