How Should a Non-Techie Learn Programming? 346
CurtMonash writes "Nontechnical people — for example marketers or small business owners — increasingly get the feeling they should know more about technology. And they're right. If you can throw up a small website or do some real number-crunching, chances are those skills will help you feed your family. But how should they get started? I started a thread with the question on DBMS2, and some consistent themes emerged, including: Learn HTML + CSS early on; Learn a bit of SQL, but you needn't make that your focus; Have your first real programming language be one of the modern ones, such as PHP or Python; MySQL is a good vehicle to learn SQL; It's a great idea to start with a project you actually want to accomplish, and that can be done by modifying a starter set of sample code (e.g., a WordPress blog); Microsoft's technology stack is an interesting alternative to some of the other technology ideas. A variety of books and websites were suggested, most notably MIT's Scratch. But, frankly, it would really help to get more suggestions for sites and books that help one get started with HTML/CSS, or with MySQL, or with PHP. And so, techie studs and studdettes, I ask you — how should a non-techie go about learning some basic technological skills?"
what problem are you try to solve? (Score:4, Insightful)
PostgreSQL a better choice for database (Score:5, Insightful)
I wouldn't start with database stuff until you have a programming language or two mastered, but when you do learn one, learn PostgreSQL. MySQL's SQL flavour is messed up and because their parser doesn't handle relational calculus well, you're stuck with a language that's unusuable for much of SQL without syntactic contortions.
I wouldn't start with web stuff either - you want a classic programming background (which will be a bit depth-first) to see if you can handle it. If you can't, you probably should find another hobby - the world is full of bad code written by people who don't know what they're doing.
In my opinion (Score:5, Insightful)
In my opinion, as someone who's learned a few programming languages in his lifetime, the best way to learn a programming language (or any new technique, really) is to pick a task for yourself using that technique and figure out what you need to do to get that task done. For instance, I learned Javascript primarily because I wanted to query a couple of Sharepoint sites and display the resulting information somewhere else, and Javascript was as reasonable way of doing that as any. I learned Perl because I had a bunch of information in XML files, and I wanted to apply an XSLT transformation to all of them and concatenate the result together (that's also how I started learning XLST). I learned Java Applets because I was bored in a high school computer science class, and decided to make a 2D gravity simulation thing. I learned C++ because my dad had written his own custom version of tcpreplay, and offered me $20 to port it to Windows.
Just pick something that sounds like fun, figure out how to do it in the language of your choice, and do it.
They shouldn't (Score:3, Insightful)
No, really... They shouldn't. Programming is a way of thinking, computer science even more so and if you haven't got that way of thinking, you shouldn't touch it. I'm really sorry. My wife doesn't understand a thing I do professionally (but it brings in the bucks, so we can eat) and I tried explaining. It just isn't her world and even the basic maths behind it are beyond her. Of course, I don't understand a thing about art, which is her thing.
This is akin to the question "I have $YOUNG_FAMILY_MEMBER who likes to game, how do I get him/her programming." You don't... Unless they show real interest it's a waste of time.
I like the PHP suggestion. (Score:2, Insightful)
I like the suggestion to use PHP, it's perhaps the closest we have to oldfashioned BASIC. You hardly need anything to get started, apart from web hosting, an FTP client and Notepad. The language is well documented, its error messages are often helpful (except for that crazy hebrew one), and you get immediate reward and feedback when you refresh the page. It also has real world uses. Programming goes naturally from there, if you're curious and stick with it.
!Programming (Score:3, Insightful)
What you are describing is not programming; it's web design and database administration. They may contain elements of programming, and they're both (typically) done on computers, but they're generally regarded as separate skill sets these days.
Re:practice (Score:5, Insightful)
Maybe the best option is to take an introductory programming course at a community collage and see if you like it?
Re:PostgreSQL a better choice for database (Score:3, Insightful)
Re:Why should a non-techie learn programming? (Score:5, Insightful)
Small business want to save money by making websites on their own... unfortunately they don't have the know how nor the time to do it. Rather than learning to program, i would suggest learn to spot the technical BS. It is far better to pay a professional firm that does design and site programming since they are less likely to open some blatant security holes to the world. Knowing how to program does not equal knowing how to program well. When your livelihood is on the line, spending couple hundred bucks is much cheaper than having your business go under because the site you wrote over the weekend got hacked by some automated drone and all your client info were stolen.
But why? (Score:5, Insightful)
They shouldn't .... small business owners dont feel pressured to learn plumbing - they hire a plumber.
Learn Unix (Score:5, Insightful)
Re:They shouldn't (Score:3, Insightful)
Have to heartily agree here. I'm a techie, I understand code easily. It's natural for me.
However, I do agree with the OP that people in not-directly-technical roles should have more confidence with technology. Whether this comes from mucking around with SQL or HTML, or from just learning that most mistakes can be undone with ctrl-z, I think that gaining confidence through doing something that they actually want to accomplish is excellent.
For example, I gained confidence in home improvements by actually doing them - doesn't matter what, specifically. I know that I'll never use these skills to help feed my family - expecting that an amateur such as me can compete with folks who have actual training is idiotic - but I do know when to call the experts, how to call their bluffs, and when I can save myself some bucks by doing it myself.
Re:PostgreSQL a better choice for database (Score:3, Insightful)
It is- but *learning* sql via MySQL is a horrible idea. It allows a lot of shortcuts that are both wrong and dangerous if you're not very sure of what you're doing; learners are much better off with *any* database that's more standards-oriented.
I may sound cynical.... (Score:3, Insightful)
....but the "non-technical" person that starts with this type of mindset, I suspect, won't get too far. Learning anything complex and new requires enduring efforts and a strong will, plus a certain degree of intellectual curiosity, and a sense of purpose.
"Let's start learning something about X", especially if X is as broad as "technology" is too generic an intention, to fit what above.
It reminds me of man who goes at the library and says: "I have decided to get an education. Which books will get me educated?"
Re:They shouldn't (Score:2, Insightful)
"Computer science is no more about computers than astronomy is about telescopes." --Edsger Dijkstra
You don't have to be a computer scientist to write a program or learn programming.
Computer programming is a vocational skill. Programming is not computer science.
Although methods of computer programming, and algorithms are subjects of study in computer science; practitioners / engineers do not require a knowledge of CS, only knowledge of the right APIs for their environment (which implement the algorithms), common practices in the language in their industry, and the assistance of a software architect.
HTML, Notepad (Score:3, Insightful)
Odds are you'll never have enough time to learn programming at the depth that someone who is very good at it knows it.
Start small. Learn how to write a static web page using nothing but Notepad in Windows. Then, when you've mastered that, try using CSS to change the way it looks.
At this point, you can get into Javascript, which is a fantastic language for learning. Try to make something on the web page change when you mouse over it. Experiment with changing text fields in Javascript.
Then, write a simple "desktop" calculator as a web page.
This will likely take you a few months or weeks if you spend a lot of time at it. Remember, use Notepad only. Don't worry about making it work in anything but Internet Explorer (or your browser of choice) because that will make you insane.
When you can write Tetris [sourceforge.net], then you're ready to work with databases and servers.
Don't use MySQL, it's an abomination. If you have Microsoft Access, start with that. Make a project in that that real people will use. If maintaining it becomes difficult, it's because you don't know enough database theory. Figure out on your own why you want data to be fully normalized and only flattened with many saved SELECT queries. Try to figure out how to write the queries in SQL using the (excellent) query editor. Write UNION queries.
Now you're ready for a server and web site.
Re:PostgreSQL a better choice for database (Score:5, Insightful)
Don't box the guy in! (Score:5, Insightful)
Writing "I want to be a programmer" is like saying "I want to be a doctor!". There are a million different sub-fields, from orthopedics (EG: fixing borken bones) to orthodontics (fixing teeth) and there's a million details to know for each field.
Programming is a big, big field and covers everything from hacking firmware in assembler to writing SQL queries to using macros in Excel. Laugh all you want to, but the lowly Excel macro quite literally runs Billion-dollar enterprises, and is legitimately a programming art, just as much as assembler or kernel coders in that it gets the job that's needed, done.
Start with finding out what you are trying to accomplish, and then work from there! My goal was to build and sell information management tools, and for me, PHP and SQL seemed like good tools for the job. They haven't disappointed me, for my focus, but then, I'm not trying to build a 3D FPS, either!
Then, get the right tool for the job, and roll with it.
Re:I like the PHP suggestion. (Score:4, Insightful)
Re:Why should a non-techie learn programming? (Score:3, Insightful)
So when your car stops in the middle of a desolate no-phone zone you have some prayer of at least getting it to limp to the next town? So when the mechanic tells you your car needs a new 'connuter valve' and it will cost $500, you know to take your business elsewhere? Because the guys at the quickee-loob are always forgetting to tighten the oil filter and put the drain plug back in? So you know that when the check engine light comes on it means eventually but the oil light means right now?
I'm not a doctor, but I know enough to know when I'd better see one and when I should just wait it out.
Re:Q: How should a non-techie learn programming? (Score:3, Insightful)
Oh really? (Score:2, Insightful)
I disagree.
I don't need a "mindset" to sit down and start reading.
I just need to sit down and start reading. Once I sit down and start reading, I start learning.
Funny how that works.
Don't (Score:5, Insightful)
I've been programming for 25 years.
Here's what you'll get. You will learn language A, become proficient in it, get a job using it and then eventually get laid off.
When you look for work, you'll find that Language A is no longer the "in thing". They want people that know language B, which was introduced 5 years ago.
The H.R. people will want only candidates that have 7 years experience in language B.
Then you'll learn B, but someone will come up with B#, B-, B++, B--, all basically the same thing, but with just enough differences that they can copyright it and irritate the hell out of you when trying to figure out where to put the semi-colon
The H.R. people won't accept experience in the B(variation) that you know, only the B(variation) that they want.
And then you'll have to deal with language bigots. You know B(variation) but not D? Well then, you are one or more of:
a) not as productive
b) not a "real" programmer"
c) you write buggy code.
Then the E bigots will dump on the D bigots while the database language "Seroquel" (many programmers know what this is are are probably taking it) bigots watch with amused expressions because they know only their language is a "real" language.
It gets worse.
At some point they will change the entire paradigm of application development to a new one where you have less control over how it looks, works differently depending on the user's browser preference and requires giant servers. Sure, you don't have to deal with Installers, but at the cost of submitting your program to the whims of the server, the network and the user's preference of browsers.
Oh...and H.R. now wants:
10+ years work experience as a Technical Lead working with the following languages, tools, and methodologies:
* Technical lead role
* Agile development
* Project management
* Implementing Microsoft technologies
* Web architecture design and implementation
* High volume system architecture design
* Hardware and software load balancing technologies
* Data replication / ETL technologies
* Multithreading, socket programming, distributed transaction processing
* System stress testing / performance testing framework
* Business process / rules modeling
* Business Intelligence tools
Responsibilities
* Lead technical teams in designing and prototyping technical solutions
* Create implementation proposals
* Review technical designs, code, test plans
* Create well-designed, reusable objects
* Create and execute project work plans for the technical team, revising as necessary to meet changing needs and requirements.
* Communicate and enforce best practice coding standards.
* Consistently deliver high-quality products and services to clients on schedule.
* Communicate difficult/sensitive information appropriately.
* Communicate with customers technical concepts in easy to understand language.
* Communicate effectively with stakeholders to identify needs and evaluate alternative business solutions with project management.
* Develop an understanding of clients' business and suggest effective programming solutions.
Personal Attributes
* Creativity and strong attention to detail
* Ability to work effectively on tight deadlines as necessary
* Effective oral and written communication skills
* Exceptional customer service skills, including the ability to interact professionally with a diverse group of customers
* Desire to learn new skills and improve
Required Skills:
* Experience as Technical Project Lead, Architect, Lead Developer or other position of major responsibility on mission critical software projects
* C#, ASP.NET, VB.NET,C++, C, and/or JavaScript
* Relational databases: DB2, MS SQL Server, and/or Oracle
* Experience designing and coding superior technical solutions, creating and executing well designed and reusable objects, efficient and logical databases for clients, project work plans, revising as necessary to meet changing needs and requir
Re:Don't (Score:4, Insightful)
I can't help but notice that if you take the Microsoft-related technologies from the requirement list it starts to look adequate.
RTF O'Riley book, beats the little padded room (Score:2, Insightful)
"Pick a project and work out the language by trial and error! Whee!"
This is the path to madness. When you're breaking your way into the tech world, starting from outside, it's easy to find yourself with a problem where you don't know enough terminology/context to write an effective google query, and no idea how to read the answers your query returns... a situation where continued effort produces vanishingly small returns. I once spent well over an hour just trying to guess what the key notation "M-x" meant on an academic linux app (having not encountered emacs). "M?" I ask you.
It is so much simpler to start out with an O'Riley book. Many of them begin with the very basics, are mildly sarcastic, and have all the benefits of RTFM... a few chapters in you'll know little details that the trial&error folk haven't picked up in a decade of experience.
Once you've got a grip on the basics, *then* you pick up a random project and try your luck.
Re:But why? (Score:3, Insightful)
Re:PostgreSQL a better choice for database (Score:3, Insightful)
Uh, handling of nulls, empty strings, and default values are not the same as in anything else. They're also absolutely horrible practice and encouraging new users to learn them is flat out retarded.
Also, I very pointedly didn't mention PostgreSQL. I advocated any standards-compliant DB. MySQL does not fit that bill.
n/a (Score:2, Insightful)
Re:Don't (Score:1, Insightful)
And as you can see from some of the responses, programming can take a toll on your sense of humor.
I regularly teach programming to English majors (Score:2, Insightful)
For about 10 years, I have been teaching Inform to students (mostly English majors) in courses that combine writing with media production. I start them off with HTML and CSS (just to get them familiar with the level of accuracy required of any kind of coding). I've also taught Flash, but this fall I will probably drop it to make more room for Scratch.
The point is not to make these English majors into professional programmers, but rather to familiarize them with fundamental processes such as iteration, versioning, scaling, beta-testing. To someone who has never written a computer program, even very simple concepts such as if-then statements and variables can be completely baffling. I notice that students who play old-school text adventure games are at first very unforgiving about the limitations of the parser, but after they've programmed their own short games, and watched their beta-testers come up with reasonable vocabulary words that they expected the programmer to have implemented, students are more ready to appreciate when a text-adventure author has done a good job anticipating the user's actions. This is a lesson that, I hope, translates to their encounters with other interfaces, making them more willing to take beta-testing seriously, in the future, when they might be writing the copy for team that includes programmers.
Re:But why? (Score:4, Insightful)
if the OP was asking how to learn some basic PC maintenance, save on a couple easy repair calls, maybe even set up a simple LAN, sure. but he is asking about how to do things that are well beyond the skill level of a "handy guy". if he is unable to distinguish between the "simple fix, save a buck" stuff and the "you probably suck if you haven't been doing this every day for 10 years, and maybe even then" stuff... well all the more reason to discourage him from going further.
Re:practice (Score:1, Insightful)
Agreed. The asker seems to be looking for some silver bullet there really is none. Ultimately it dies not matter what language you use or what paradigm you subscribe to. The only thing that will make you proficient is practice.
As one of those people who're only getting into code now, I see it as useful in the same way as knowing a little bit about cars is useful, or knowing front/back of a power drill. It's important to know enough about all the parts of your company that you don't get screwed. It's easier as an administrator to understand why something isn't done if it's an area where you know (even vaguely) what's going on. Right now, if someone tells me that the thingamabob won't run because the blobdiblue won't support the gadget, I'll just have to take them at face value. With even a little knowledge, I would be able to do more than nod politely.
(That being said, I also love the idea of coding, so this could all be excuses for me to start a new hobby).
Re:Don't box the guy in! (Score:5, Insightful)
So very true, regardless of what you're trying to learn. If it doesn't relate back to something you're already interested in you're not going to be able stick with it over the long haul.
The MIT Way (Score:2, Insightful)
Look, there is no "right way" to start. MIT presumes you need to learn about what programming is all about first. Then they teach Java, C/C++, MatLab and so on later on in engineering and science classes. They created a nifty system, Processing(.org), that takes the sting out of Java and uses it to show designers how to hack.
Re:Good Lord, No. (Score:2, Insightful)
More recently, when a partner asks for a special report or view into our data that isn't supported in our website, he'll throw together a quick page to query our production database and display the results in a tabular format, and share that with the partner. He's got his own webapp running somewhere on our network with its own authentication and access control scheme which is completely separate from our main site and the control of our engineering and IT departments (I actually have no idea how he managed to get that hosted and accessible from outside our vpn to begin with).
As one of the slow-moving engineers that his web app was created to circumvent, I won't even go into all of the concerns that I have with this setup. What I will say is that - all things considered - his apps actually aren't too shabby and the people who use them LOVE them for the utility they provide. And while this guy is really someone who I would consider a special case, I've also noticed a broader trend in my company on the "business" side: people who can write a SQL query and crunch some numbers tend to get promoted faster. As for this specific VP - he absolutely destroys his budgeted numbers year after year and I can't even imagine how large his bonuses must be.
To the original poster I would say "yes, learn some 'programming' skills". As for how to do that, or what specific skills he should learn, that really depends a lot on the work you are doing. Every technical skill that I've ever really learned has been because I had some specific need for that skill. I've never had to ask what or how to learn something because almost always the answer was standing right there in front of me (usually the "what" in the form of a challenging problem and the "how" in the form of a good book or google).
With that being said, here is the best advice I can give: the next time you need to ask a professional "techie" for help, ask yourself (or the techie) what exactly it is that the techie is doing. (Note: if the question turns out to be "build and entire web application", you probably need to think smaller scope). Then, figure out how to do that thing for yourself. Do that enough times and you, too, will have earned the title of "techie".
Re:Don't (Score:4, Insightful)
I've only been in the programming game for a decade but I don't suffer from that. Why?
I never did program in anything fashionable or new. The language I use for 99% of the serious stuff is C, there are always loads of jobs in it for someone with a few years experience, and it was designed in the late 60s/early 70s so it seems to me it's unlikely to just up and die any time soon.
I'm not trying to get into a 'which language is best' flamewar here, but from a career perspective I've done very nicely out of it. I do learn bits and pieces of other stuff as needed, but having C as a base ensures I'm never out of date (or perhaps I'm always out of date :)
Re:practice (Score:3, Insightful)
My opinion is that you should learn programming first, basic command line stuff. Then move on to the GUI. After that you can learn how to manipulate databases. After that, you should move to the web.
Re:Learn Unix (Score:2, Insightful)
Re:PostgreSQL a better choice for database (Score:1, Insightful)
Basic CRUD just doesn't work in MySQL, unless one uses InnoDB. That's not the only problem, though – lack of verbosity in error messages in particular makes MySQL a bad choice for a beginner.