Starting an Education in IT?
AriaStar asks: "It's overwhelming to start trying to learn all the different technologies needed to go into programming. It seems that every type of technology assumes knowledge of a different one, which in turn requires knowledge of another, until it's gone full circle. I am interested in everything from Unix to AJAX to Perl. Things like HTML, Javascript, and SQL are like English, but then again, they're basic. Where is the best place to start? What is a good path for someone who learns quickly and easily, but who is simply too overwhelmed, to take?"
man ls
After that just follow your nose and interests.
My little Linux and tech blog
Start a complex project. And read some computer science books. And learn how to design a good user interface, we can never have too many of you guys!
The best place to start is in your youth.
There's a lot to look into, but whatever you learn, take the time to figure out what's actually happening under the hood, especially if you use RAD tools. There are two groups of people: those that know how it works underneath, and those that don't. Those that do can output much more wonderful things. Certifications are a good way to make yourself get under the hood and truly understand.
Easy. Pick something you are interested in and can hold you attention for a few minutes. Then figure out whether you are in it for the short-term or long-run. The start reading up on the classics like http://www.norvig.com/21-days.html, the Mythical-Man Month, and Peopleware.
Cheers.
Learn the basics of a couple of programming languages and then get experience. Being a programmer or an IT specialist are both like being an auto mechanic. You can learn a lot from the books, but you'll learn a lot more from experience--especially if you have a good mentor.
Your goal at this point in time should be to have enough knowledge to at least get in the front door. And if possible, work at a non-Windows shop that makes custom applications. You'll learn more.
Oh, and I forgot, if you have time, learn electronics and assembler. Both of those will help out way down the road once you have to deal with many subtleties in the world of computers (of which there are many).
Grab a used PC, install Linux on it and play around with MySQL and PHP. It's a cheap and easy way to learn the basics and you can adapt to whatever technologies are in use when you get hired in a development shop.
There's a lot out there. You might be able to get a sample of a bit of everything, but ultimately, you should probably pick a field and stick to it. If you have wide-ranging interests, pick a place to start, and let your journey wander from there. Pick a project, learn what you need to do it, and then move on to the next. But there's simply too much out there to "learn it all"
Take a course in basic programming structure first. You need the foundation of how to properly setup the code. By that I mean declaring variables, setting up functions, properly commenting (gasp) your code so that others can follow what you've done.
Once you understand the proper structure it is much easier to branch out to the nuiances of the various languages.
Learn about different interest areas and use them to your advantage. You do not always need to know the inner-workings of something to use it effectively, saving you time and money.
Studying IT is waay too general.
Here's a question you might first want to answer: do you want to be a specialist or a generalist? to be a generalist, you probably want to be a specialist at one field, security, database, web design, web programming..etc. The fact of the matter is that there is so much out there, that you have to be a bit disciplines to really get anywhere. Or you can find an IT job doing support or so, then on the side start learning the underpinnings of a certain vertical market. Perl + Unix + C would be very good fundamentals to look at. IT is not a field like medicine, it's hard to draw a path, since there's so much to know and so many options. I would consult with someone who is an IT pro and possibly follow his/her footsteps. But yes it's a challening feat to 'master'.
Insinct is stronger than Upbringing - Irish Proverb
As a college student working toward a BS in Computer Science and sneaking in an AAS in Web Design, here is my suggestion.
If you want to do web technologies primarily, then start with HTML. Since you will use this in almost every other area which you want to learn, become comfortable with hand coding html.
Second, setup a Linux box to act as a development server. This will force you to learn how to work within the *nix world. In the interum you can use XAMMP for a nice bundled Windows package with Apache, PHP, MySQL, etc.
Next, learn some foundational OO language. The two staples are C++ and Java, though there are many others. Once you become comfortable with one language you will find that most other languages are pretty much the same.
Finally, go learn one dynamic web programming language then when you are comfortable with it learn others.
You have a whole list of tools. What you need to learn are design skills, how to abstract, how to put together a piece of software. What quality is, and how to go about getting there. As was mentioned, learn how to put together a good UI.
Yes, you have to learn tools. But be aware that there is more to it than that, that your ultimate success of failure will depend on your vision, not the facility with which you use your tools.
I am reminded of the amusement of a master carpenter when confronted by an apprentice with a shiny new box of tools. You will, at some point, learn how to use a hammer. But knowing how to use a hammer does not teach you how to build a house.
Floating face-down in a river of regret...and thoughts of you...
For me it has never been enought to know the technology... I had to have a project to work on. So the place to start is to define what you want to do.
Everything is built on top of something else. Every idea comes from someplace. And if you know what you want to do then you can investigate stuff that is at its base what it is you want to accomplish.
Best places to start W3 Schools...
That covers the basics of everything.
I work in Flash quite a bit and people ask me where to start learning flash. With the project learning method I send them to http://gotoandlearn.com. The tutorials on that site use some of the industry proven Actionscipt methods and give a good base level knowledge.
So find a project and get cracking.
--Chris
I had a flame... but she had a fire.
OK, for practical advice, learn 1) an object-oriented language like Java, C# or C++. Nowadays, even PHP is OO, if you want it to be. But with Java, you can't even write "Hello World" without acquainting yourself with classes and objects.
Learn relational databases, including normalization. You would not believe how far ahead this will get you.
Dark Reflection
Don't just read about stuff. Do stuff.
Find a pet project, find someone with a pet project, volunteer to help a friend or community organization set up a website. It has to be something you're interested in doing or you'll avoid it and not enjoy it. Pick a target and shoot for it, O'Reilly and Google at your side.
The only way to really learn anything is to do it. I read a bazillion books about DNS/Bind but none of it sank in until I had to set it up myself. Same with SQL, Perl, Python, Template Toolkit, C++, etc.
It's annoying, it's painful, it's frustrating, but the only way to really learn anything is to get in there and get your hands dirty.
If you want to learn how to skate, take a tennis ball and chase it around a parking lot while having skates strapped to your feet. Don't spend more than a few minutes trying to consciously learn how to stand, roll forward, brake, or fall. Chase the ball. Do something OTHER than learn how to skate, but do something that requires skating. Your medulla oblongata will do the job far faster if it's allowed to do it without micromanagement from your conscious mind.
Same goes for programming. You won't learn how recursion works by typing in a fibonacci example. You'll learn how recursion works when you want to make a gallery thingy and find yourself needing to catalogue all *.jpg files below a certain directory. You won't learn how object oriented programming works by re-reading the wikipedia article on polymorphism, you'll learn more valuable lessons when you decide it's insane to be writing almost identical code in so many places and realize that's what a parent class is for.
Solve YOUR problems, not the book's, and you will develop a passion for problem solving. Almost all of the "programmers" out there who succeed have one thing in common: they wanted something implemented so they got it working on their own.
[
Knowing what to focus on can be taken as a research problem. Before actually trying to learn how to go about using the individual technologies, you need to research what each one is, why it is important, and how it will fit in with other technologies you would like to learn.
In some cases, the answer may be to learn a little about each technology progressively. Learn a little HTML, then some Javascript, then more HTML, then more javascript, more HTML, the DOM, XML, ...
When technologies are interrelated you sometimes need to learn a little about all of them before you can really start to master any of them.
Or just start trying to learn the most about what you're most interested, and when you discover another technology is involved -- start learning a little about that other technology too.
Personally, nowadays I'm giving people PHP as their first language. Well, first PROGRAMMING language. HTML is fairly easy and simple to understand, so giving them basic assignments of doing text output (like number generators for example) in PHP is a nice begining.
Part of the reason I prefer to give people PHP, is because quite a few web servers support it now. Another reason, is because you don't need a compiler. The next would be the simplicity of string manipulation. And from there, you can get people into basic file handling and other things of that nature which will carry over nicely to other languages.
I went to college for psychology and criminal justice. Since I was paying my own way, I went around looking for jobs. I tinkered in PCs before and was willing to learn anything, so I applied for and got accepted to a job with our ResNet (Residence Hall Network) department. All I knew at that point was installing Windows, some network stuff, and other odds and ends with computers.
We had a small team, probably 14 students in total and had a non-techie but very nice and open supervisor. We were given specific areas to work in given our strengths but there was absolutely no problem with teaming up to learn something new.
When one of the students left, leaving a half-finished VB project, I decided to try and tackle it. Working closely with my friend Sean, we worked out what was done and what needed to be done. Any resources I needed were supplied by other staff members or my gracious supervisor. In the end, I learned a whole new programming language (albeit, not the one that many Slashdot geeks are friends with). I worked with our web dev guy to try and learn PHP and Perl (I failed miserably) and worked with another guy to learn about imaging. I talked with the university's network admin about how routing worked, Novell stuff, whatever.
In the end I picked up so much that I decided to pursue a career in IT. Now I am a helpdesk manager, I love my job, and I try and emulate my old supervisor as much as possible. I learn a lot from my students (my latest challenge is ASP) and I try and teach them what I know in return.
Just like the OSS community I feel bound to take what I've been given and pass it on to others. I'm not certain what your particular situation is, but I think surrounding yourself with people who know the technology, languages, or protocols goes a long way to staking out your own learning experince.
Don't be afraid to hit the local library either. They usually have the latest books (for some reason the latest PHP/MySQL book is always available!) Ask a lot of questions, and don't be afraid to set up a sandbox and just play. Last bit of advice: Don't get frustrated. I can recall many times when I was against a wall with some weird configuration problem or what have you only to find the solution after using Google or taking a walk.
Good luck!
"This food is problematic."
I'd learn Unix first. Download yourself an emulator (I'm not telling you to switch to Unix) and a Linux or FreeBSD distribution (or open up Terminal.app if you have a OS X Mac), get yourself a Unix book or online Unix tutorial, and start learning some basic Unix commands. Once you are bored with ls, grep, and friends, learn how to set up X11 and basic system administration skills. Having a grasp of Unix will help you out in a lot more areas than one would imagine at first.
Much of computer technology (scripting languages, web development, etc.) seems to revolve around the ideas of Unix, even if you're doing all of this stuff on a Windows box. Learning Unix is very beneficial, even if you end up hating it and stick to Windows as your desktop OS. Learning Perl will also be much easier coming from a Unix perspective rather than coming from a Windows perspective.
$man man
To keep from being overwhelmed, start with an idea you have for something that you have a passion for. Think of some idea and lay it out on paper (or visio). I wanted to mess around with Python and we recently had a baby, so I wrote an "I/O" and sleep tracking system for our infant daughter in Python.
.NET, Ruby... Pick one and stick with it.
For the most part, all the high-level languages are the same. There are differences and strengths, but at the point you're at most of these would be lost on you anyway. You already know Javascript, so pick another language -- and try to build your project in it. PERL, Python,
About 5 years ago I wrote a project for my brother so I could sink my teeth into PHP/MySQL. It's turned into a product we now sell and make (a small amount of) money on each year. The hardest part for me is sticking to the project with no real client to be beholden to -- hence MY need to build something I really want to make, not some example out of a textbook.
When I decide it's time to learn something new, I generally see what is "up and coming" and learn that so by the time I'm fluent, I'm much more marketable. Right now, Ruby looks like a pretty decent choice.
Good luck!
Work through things, one language or platform at a time. Pick a language, one that will help your learn good programming habits and let you pick things up quickly. I'd recommend not starting with some languages (perl, VB6, asm) under any circumstances, maybe something like python. Then use the language to expand into another area, eg HTML (generated by python), and CSS. Then possibly javascript, expanding in AJAX.
There are real advantages in learning something thoroughly, and what you learn often applies well to other things you learn.
If there are some things that would be well worth learning:
- C
- C++ (particularly the STL)
- a scripting language
- HTML/CSS/Javascript
meh
Look. Start by learning a procedural language, and then learn the 5 structure diagrams. Then proceed from there to non-procedural languages.
Finally, learn Assembler. Yes, Assembler. It will teach you how things work. NOW you can learn ANY programming.
Next a course in Data Structures is good. Follow up with a course in database management. Especially if you can get a good one that teaches Network DBMS structure, not just Relational.
Operating systems are LAST, and only if you want to be systems programmer.
My suggestion is that (and in this order):
Now you should have a solid good base to learn just about anything. I would stay away from IDE's as much as possible and try to learn by hand, it is sort of doing division long hand before using the calculator.
Be aware that most technolgies like LAMP, AJAX, DHTML, etc are just applications and combinations of technologies that will be super easy to undertsand if you have a good grounding in the basics.
D.O.U.O.S.V.A.V.V.M.
1. No matter what you know you can't find a job anyway
2. If you can find a job, you can't keep it.
3. If you can keep it, it doesn't pay enough.
4. If it pays enough, it's miserable work and your boss is a rat fuck liar cheat blow-dried phone-flipping asscrack.
Business has turned its back on its neighbors. They are interested in nothing except your money. You could have three PhDs in Computer Science and they'd still find a reason to disqualify you from any job.
They aren't happy with their share. They want your share and the other guy's share too, and they'll fuck over everything and everyone else to get it.
Cue Slashdot apologists for the Neo-Darwinist "screw everyone else" Faux-Capitalist game show economy.
Business isn't willing to pay for products, innovation and careers, so we get brands, mortgage commercials and layoffs.
Learn Python. Seriously.
Here is my list of "musts":
* HTML
* Java
* Php
* SQL and relational theory
* JavaScript
* Lisp (not used much in practice, but has interesting concepts)
Note that this is not necessarily an endorsement of these languages, only a practical suggestion.
Table-ized A.I.
You've named a lot of high-level and low level technologies together (i.e. Visual Basic, AJAX). What you need to do is learn the basics, a good language to start with is Java, as well as read design patterns, OO design, algorithms, ect.
The technologies you just named today will seem very old on your resume just two years from now. You'll find that once you pick a field, your list of things to learn will be very different.
Java Enterprise? EJB, IoC, SDO, Ant, Spring, Hibernate, REST, ect.Microsoft? C#, ADO.Net, WinForms, Avalon, ect.
Web: AJAX, JavaScript, CSS, XHTML, PHP, ect.
You need to worry about all the trees after you pick what forest appeals to you.
Finally, Avoid tech ego; do your best; Always think in concepts, not code; always think of the use case; never forget they count on you to tell them what is best, like you count on a doctor. That's a real responsibility. Lives have been ruined and millions wasted because people didn't think they had the responsibility in IT they do.
There is a rage in me to defy the order of the stars, despite their pretty patterns.
So then, it certainly helps to have a well-maintained copy of tcsh around along with bash and vim; you kind of learn a bit of those, then you either have ideas for some cool ways for things to be and work to make them happen, or you run out of interest and maybe eke out a living repairing XBox remotes and renewing catalysts, I dunno.
The thing is, if you are going to plot out the things you think you can learn and do, go ahead and map them together so that even if you end up rerouted, your stuff gets done and interests served. If instead you plot things out that you develop a hairy kolgomorov plot of what you may have been interested in, you are becoming some kind of tortured historian rather than an Electrical or Mechanical Engineer or Computista or Web Linguist.
Mathematica running in the background, use of User Mode Linux, a certain caprice with the pinout of your PS2, genuine distaste for having the same book loaf around more than a week, and a rabid pursuit of the journals and apocrypha particular to your interests might help.
You may need to leave periodic reminders to use a tennis racket (juggle a ball while running, etc.) and some hippie kryptonite.
Once you know how it works, you can always repurpose things attached to your body like EKGs, BVO2Ms, etc.
First, it doesn't pay to learn programming languages. Programming languages change or are replaced by the next new thing. Who knows what programmers will using in 5-10 years.
If you want to program, learn how to write algorithms. Once you learn how to write algorithms, you can write in any programming language, even if you have never been trained in it.
That was the first thing I learned in the programming section of my IT degree. We didn't touch a programming environment until halfway through the semester, and by that point, we could write the algorithm for a PB&J sandwich in pseudocode.
When you can write algorithms, you can become language portable. If you have a job that requires C#, you can use a desk reference and the help system to implement your code. If your next job requires Delphi, you won't need to completely retrain yourself.
Finally, give yourself projects. I learned how to develop databases by giving myself personal projects in that field, taking advantage of the MSDNAA to get SQL Server 2000 and Microsoft Access. With a simple SQL refresher, I would feel comfortable sitting down and hand coding a simple DB in Oracle, DB2, or MSSQL (not taking into account differences in each SQL implementation).
My Sysadmin Blog
1. Discrete Mathematics (recommended textbook: Discrete Mathematics by Kenneth A. Ross and Charles R. Wright)
2. Finite Automata and Computability (recommended textbook: Introduction to Automata Theory, Languages, and Computation by John E. Hopcroft, Rajeev Motwani and Jeffrey D. Ullman)
Technologists who understand the fundamental theory can generally write more elegant, more efficient computer programs than pseudo-technologists who are ignorant of the science in computer science.
Once you have trained your mind on the fundamental theory, you will discover that most information technologies are quite simplistic.
Finally, one often overlooked subject is English. Learn to write and speak well in English. It is the fundamental mode of communication in the world of advanced science and technology. You may have great ideas, but if you cannot them to your English-speaking peers, then you are no better than a pseudo-technologist.
Before all else, learn Literature Programming, in the style invented by Don Knuth.
We use nuweb---it works with any language.
Seriously, learn some assembly. Read the handbook. (Intel IA-32 Software Development Manual or equivalent for other processors.) There is no substitute for knowing what the processor is actually capable of doing. Then you can appreciate what a high level language is doing (and not doing) for you. Look at the assembly that the compiler produces. This is all fun stuff. Enjoy it. (If it isn't fun, move on to some other profession.)
Then you can move up to C, C++, whatever. Just realize that there is nothing magical about high level languages. The processor can still only do what you read about in the handbook. Personally, I've never gotten past using Assembly, C, and C++. I've never had any use for any other languages. None of them do anything fundamentally different from what I use.
This may not be the right path for you, but it has worked very well for me.
Good point you're making...it really is much harder for a total newbie to get a solid start from zero knowledge these days. I think it's partially due to the fact that so much of the earlier computing era is hidden behind well-crafted user interfaces designed to keep you out of trouble.
I'm really dating myself here, but my first exposure to computers was with an inexpensive Commodore home machine that shipped with manuals detailing the entire memory map of the system. With 4K of RAM and all the specs published, it would be very easy to write your own software, which was probably the point. Fast forward to today, and you get way too much to deal with when you get a computer. It used to be really simple to create a "Hello world" or even something more complex in BASIC or some other language. Now, at least on the Windows side, you have a development environment that, to me, is very hard to get going with in anything but Visual Basic. The document object model for web development makes sense to me, but Windows forms programming seems like way too much effort to learn. Besides, grunt coding work is all going to be overseas soon anyway...
Since computing is so pervasive now, you really have to pick a branch to learn more about and do as much hands-on research as you can. As an IT professional (sysadmin, non-developer type,) I could never possibly keep my focus on every single new system, new trend, etc. There's just too much information to digest and still have a life.
The way I always pick up something new is find a neat project online, or start from the perspective of solving an existing problem I have. It's a fun, challenging and often really frustrating way to learn stuff. THe fun thing is going back after a few years and shaking your head about the crazy, inelegant way you learned Technology X.
One other important thing...in the computing / IT world, you're always learning. Even if you end up doing the same type of thing, the way you do that type of thing can and does change overnight. Just ask anyone who's worked in corporate IT from the mainframe era to the PC era to the client/server era and now back to the mainframe-style centralized computing era. If constant change is what you're looking for, welcome!!
Good luck!
I'm not sure about the rhetoric in your question - I wouldn't write off Javascript and SQL as "basic."
It seems to me you should focus on learning how to program - languages and other "technologies" will fall into place reasonably quickly after that. Try Python, or Ruby - they're nice languages, with good documentation and strong communities. Avoid C++ for now.
Further, focus your interest - what aspect of working with computers excites you the most? Even if you reply "everything," select something and pursue it so that you have a framework for learning.
And for some perspective - I'm an applications programmer, mostly Objective-C, and I couldn't tell you the first thing about AJAX or Perl or a host of other acronyms. In other words, not knowing "all the different technologies" hasn't hurt me yet, AFAICT.
Best of luck.
feel free to drop me a line at my email. I'm working on a large project using perl and Catalyst (Catalyst is similar to RubyOnAlls). If you are interested in those technologies I can give you a place to start.
The IT field is huge. You need to find your own way around it. You might like client side development using Javascript and AJAX, or you might prefer to work in the database with languages like PLSQL (Oracle). I always found I learned the most by taking on a tough project and working at it until I made it work. Your results might vary.
Peace, or Not?
Yes, you need to learn actual, practical things about the operating systems, DBs, and languages you'll be trading on. But the thing that too many would-be IT people seem to miss is that very few IT careers thrive without some context in the wider world. The programmers, even the server jockeys, that bring some "vertical" awareness to what they're doing, are way more valuable, and their employers are more willing to look past the lack of some particular new skill (and pay to have you go learn it).
Why? Because experience and an interest in what the organization is actually doing (and which the IT people are there to support) is harder to come by than someone who can remember some bit of API syntax or or write a select statement with a 5-way join right on the first try. Be well rounded in IT, sure, but also take time to understand where money comes from. Why projects fail. How Sarbanes-Oxley impacts database backups. What HIPAA is.
If you're going to expect an IT paycheck, get hip to what it is that generates the demand for what IT does, and what it means to be worth the money. That sounds rather vague, but if you follow the other advice you're seeing here (about how to get acquainted with various languages, coding structures, etc) you're only partway into a successful scenario. You'll be far more likely to be paid to learn the interesting new things that come along if the organization you're working for sees that you're interested in the bigger picture.
Don't disappoint your bird dog. Go to the range.
The last sentence, " You may have great ideas, but if you cannot them to your English-speaking peers, then you are no better than a pseudo-technologist. ", should read, "You may have great ideas, but if you cannot explain them to your English-speaking peers, then you are no better than a pseudo-technologist."
I know it might sound a little strange but if you can develop mainframe skills in 5 years you will be worth your weight in gold. So many of the current people that are mainframe system programmers will be retired by then and there are not many people learning the skills to fill their places. The one problem is it is hard to learn the skills because you can't just play around with the latest versions of mainframe software on your PC like you can with most windows and unix tools and applications. IBM has a lot of information and free learning modules on their site and several schools are starting programs to teach these skills to fill the knowledge gap. Plus you can learn how to run linux on a mainframe too so that you don't feel totally in the dark ages :)
Go to a university with an accredited CS department and get yourself a BS degree. The technology and buzzwords change every few years, but the theory still applies. Learn the theory and then use the tools to apply it. As the tools improve you will still use the theory. If you go learn tools, then when the tool changes in a few years, you will be lacking.
To go along with that line, consider checking into publications like Information Week and Network Computing from CMP. You can swing a free 1 year subscription to them, and it will get you inside what is going on in IT.
My Sysadmin Blog
A lot of times knowing the building blocks (e.g. learning the languages) is easy, as you say. But where a lot of people fall down - and I hate to say it, but it's more often on the *nix end - is understanding what it is you're trying to build. Learning SQL is easy, yes; but understanding how a database should be constructed is not always intuitive. Learning JavaScript, HTML, etc. are easy; but knowing how to present information clearly, or how to put together an interface that'll be easy to use, is harder.
Once you learn the principles of one language, you can pretty much intuit the others from there. So learn a language or two, but then take a course on database theory or interface design. Figure out what you like, and then focus on that.
#DeleteChrome
The general progression for a CS student(with some variation) is: Basic Programming -> Data Structures -> intermediate topics: declarative programming, software engineering, assembly -> more specialized stuff: compilers, concurrency, AI.
I'd suggest that this is a good path.
I'd also suggest you avoid php like the plague. It is a language that does not encourage good programming practice among novices. Also, it is terribly designed: you should see the best that IT has to offer, rather than the worst.
This is very much my situation. I just finished a Computer Science AP class at my Hich School, and know Java quite well, as well as c++, which I suppose isnt too bad for a high schooler. My suggestion: find someone you know, a teacher or an older friend, who knows something, then learn everything you can from him. I had a great Computer Science teacher in High School. Though it was just a Java class, I also got my feet wet with c++, css, html, bash, and loads of other stuff. The trick to learning something is to use it. You WILL NOT learn c++ without writing a large-ish program in c++, config your enviornment, read books, and get everything running. The same applies to every other language.
Youo want to generalize yourself, so my strategy is to learn one language that you like pretty well (java would be a good choice), and at the same time, poke around in python and c++. That way, you can learn advanced programming ideas and dont have to worrb about the language, and learn fun programs. Have some fun and experiment: Write a network program - you learn a lot about networks. Get your program working on linux - learn about portability and the linux shell. Write a good game engine - learn how to use enginges. The key is to just jump in.
This is all applying to learning oo languages, but it applies to everything.
And there are computer curicula that do the same thing. And one possible strategy is to work your way through such a curiculum. But most computer geeks would rather work on their own, and they'd rather study technology they see being used, not what some textbook says are "basics". That's actually the way I learned.
And if you take that approach, you will constantly run into references to technology you know nothing about. So deal with it. It isn't a mortal sin to skim over the parts you don't understand well. So you're reading that PHP manual and it starts talking about SQL. That doesn't mean you have to drop PHP and start studying SQL. It probably means that SQL is something that you'll have to learn eventually. But for now, the thing to do is just skim the SQL parts and get a vague sense of what it is and how it relates to PHP. Maybe take a little time to Google or Wikipedia SQL — but don't lose your focus on PHP.
Of course, sometimes you will discover a new topc that's a prerequesite for stuff you don't understand. (Every programmer know aboutbinary encodings and two's complements.) But mostly not. I've been working with computers longer than most Slashdotters have been alive — and I still encounter places where the subject I'm trying to study seems to intersect subject I know little or nothing about.
Many people have the ablility to learn quickly and are interested in wide variety of fields. In my experience, it's better to not think of those abilities as an asset. Interest and ability are a dime a dozen. It's the ones who have commitment and discipline to their respective fields who are truly valuable. Don't *ask* what you should be interested in. Find something you like, integrate yourself in the community, and don't get distracted by philosophical ruminations or side projects.
brandelf -t FreeBSD
You may look at the comments and find yourself worse off... But let's take an example:
You want to learn AJAX. Ok, learn (X)HTML, CSS, JavaScript, some basic XML (XSLT can help, as you can play with it in the browser), and learn the server-side technologies -- PHP, Perl, Python, Ruby, even C/C++/C#/Java -- Perl might be the fastest to get started with, and learn some SQL programming -- MySQL.
You don't necessarily have to do all of those for basic AJAX programming, but it helps. You also don't have to go at all in the order I described, but it can help to start with something that gives you immediate results, like HTML, instead of something that'll be abstract and arcane until you combine it with other tech, like MySQL.
But, the important point is, even if that's too much, if you just pick one of them -- say, HTML -- you're getting somewhere.
Don't thank God, thank a doctor!
Discrete Mathematics (recommended textbook: Discrete Mathematics [amazon.com] by Kenneth A. Ross and Charles R. Wright)
You ought to write a review at Amazon.com since the others there gave it an average of two stars.
My old college's motto applies well to anyone trying to "learn IT": learn a little about a lot of areas, and a lot within a few areas. That way you can experience what it's like to be both a generalist and a specialist. Decide which approach you like better, and follow that path as a career. Yes, it takes some time to experience both sides of the fence, but if you can afford that time, it will be very well spent. Personally, I'm a generalist who wishes he had become a specialist, but different temperaments lend themselves to different types of careers, and you may discover that you lean the other way.
If you're going to expect an IT paycheck, get hip to what it is that generates the demand for what IT does, and what it means to be worth the money. That sounds rather vague, but if you follow the other advice you're seeing here (about how to get acquainted with various languages, coding structures, etc) you're only partway into a successful scenario. You'll be far more likely to be paid to learn the interesting new things that come along if the organization you're working for sees that you're interested in the bigger picture.
Very important, and often overlooked. The way I often summarize this is "They're not really paying you to play with computers all day." You have to be smart on both the technology and the business side of the fence. I see great techies coming into the field I work in (transportation) and get frustrated because they really don't know what goes on behind the ticket counter and how they're connected to it. Consequently, IT departments get a bad reputation because they're just perceived as a necessary evil to keep the business running.
Visual Studios and WYSIWYG-majigs can provide huge conveniences (most of the time) to the experienced developer, and as such you will probably want to learn them someday, but when you're learning a language they will tend to leave you with that "I don't really feel like I get it because too much was done for me" feeling. Try to do all your work using a command line (learn to use GNU's Make or some scripts when commands get long) and a text editor (vi, emacs, notepad++, something that doesn't put too many buttons and graphical "helpers" in your face). I say that mostly as an aside -- I too have the urge to go on for a few paragraphs about the importance of staying problem-oriented and understanding what's really going on backstage, but it's been said and said well. :E
You've just made a huge generalization about what "IT" is. The IT industry has a lot of technical skills involved and is almost impossible to be a master of it all since it evolves so quickly.
To make a metaphore, it's the same thing as asking people how you could become great at sports. Your goal is to be great at all sports such as baseball to hockey to golf, but you don't know where to start. The most obvious answer is you should start where you are most naturally talented. The other side of the response is that people will tell you if you want to do it for a living, you can't start out trying to master everything. In fact, it's probably a disadvantageous to start off so broad.
To address another part of your question, while the technologies may seem interrelated, there is definitely NOT a full circle in terms of requirements. For example, a programming language rarely requires a deep understanding of another technology to pick up. And if you want to be safe, start at the basics. Don't start off trying to program in AJAX, which is a mashup of various programming languages and methodologies. First you start with HTML, then you work on learning server-side programming such as perl, python, or php. Then you learn client-side programming (Javascript). Then you learn XML. Finally, you put it together and you are ready to play with AJAX.
So to sum it up, I'd say you need to really investigate where you want to focus your efforts. A very clear path will emerge if you actually stop to read up on each technology and if it is built upon others (which you would then have to learn first).
I would reccommend to start with NIX. It is the root of all OS and you will find many things along your programming career that will harken back to something relating to NIX. Most application servers run a NIX OS and to program for them and administer them a NIX background will be essential. Basic NIX commands (ls, cd, chmod, chown, su/sudo) coupled with VI should be your starting point. Once you master these try tackling your first programming language - I would reccommend BASH / KSH (shell scripting) or PERL, but pick something somewhat relevant to what you are trying to accomplish and something that looks fun. Also, don't take too much stock in what someone says about learning this or that language versus another. Most of them have very similar constructs anyway. Remember that opinions are like belly-buttons. Everyone has one!!
REPUBLICAN WAR on IT Republican Party has declared War on IT. Do not walk away, rather run away from IT. Republicans have selectively targeted IT & Computer Science for massive immigration foriegner visas. Proof? Google h1-b visa database. Funny how Medical Doctors are not targeted even though it would lower the high cost of medical care. Nursing industry is also targeted. IT and Nursing have a bulleye from the Rebublican party. Managed markets are not free markets. Run away from IT and do not look back. :)
Score & Karma: SASA: Slashdot Approval Seekers Anonymous
Get a formal education in software engineering. It doesn't matter how or where you get it, but the fundamental principles you learn will make learning new technologies and languages easy.
--for your age and skill level. Out of college, no one should be offering you a senior level job unless you are getting a CS/SWE/CE degree as a formality after years of experience. It's better to take a "Software Engineer I" (out of V-VII) even if it's a little below your skills.
If you are expecting to be a super-elite code ninja, forget it. If you can handle the basics, and handle them pretty well, you'll be fine. The big thing is STFU and stop complaining if you're like a lot of Americans with learning something on your own. Nothing says you're not fit to be a software developer or engineer more clearly than complaining about having to teach yourself new things.
Learn one statically-typed, major language like Java, C#, C++ or C well, then learn a scripting language decently. Get familiarity with build tools beyond bullshit like notepad and manually running the compiler ever compile. You'll be using full-blown IDEs or build scripts. Learn all of the basics about databases and networking that you can.
There is another angle that you can take in looking at this question: what does your job require you to know? Or perhaps, what do you need to know in order to qualify for a particular position?
I've been in the IT industry for a long time, including as a consultant and I've seen companies of various sizes. I'll never forget one huge financial services firm, which of course had a correspondingly huge IT department (on the order of 1,000 people), had a guy who was in charge of DNS. That's it. This guy probably got paid 6 figures just to manage their DNS. I'm not saying DNS isn't important, but I can't believe it took up 40 hours of work a week. Anyway, that was just an example of one extreme. On the other hand, you could work for a small company that has lots of IT demands like I do, and they need me to know stuff ranging from managing the computers/network/security to the PBX and phone lines.
So if you're not currently employed in IT, do a little research. Find out what kind of company you'd like to work for, and what they want in an IT guy.
PS> If you're in England or at least get Channel 4, check out the IT crowd. It's a pretty funny sitcom on life in IT. If not, you can find episodes on the show's website or on YouTube.
Whoever Has the Most Toys Wins!
I don't truly believe it matters what you wish to learn first. Pick one and learn it, and all the rest will be easier. Much like learning a spoken language, once you know a few it gets to be easier to learn new ones. The analogy is true even to families of languages. Iterative languages tend to have common features that are distinct from recursive languages. Web based languages tend to ignore whole facets that form the bulk of some other languages.
The one thing I do believe strongly is that once you learn a few of the programming languages, you take the time to learn structured programming and design. You don't truly realize how important it is until you learn it and then have to go back and try to maintain code written by some guy who taught himself Visual Basic and thinks he's uber programmer because of it.
Seriously. The code you make after you learn structured programming and design will take about half to a quarter of the effort to maintain. The only problem is that you sort of have to learn to do code in the first place before it'll make any sense.
Unbreakable toys can be used to break other toys.
You have to ask yourself why you want to learn how to program. Are you going for a career in software engineering, or do you want to write a database to keep track of your grocery list? It's a question of orders of magnitude-- anybody can learn how to cobble together a dog house. With a bit of study, some experience and maybe a mentor or two you can probably learn how to build your own house. But you're going to have to get some education from an external source if you want to architect skyscrapers.
I just graduated from Neumont University and happen to be very happy with the job I landed right out of school! Could I have learned it all on my own? Possibly, but I seriously doubt it because there were so many things my teachers brought up that I wouldn't have gone into on my own. Plus, to get to the level that I'm at now would have taken way longer than 2 years.
But again, this doesn't matter if you're just wanting to do a couple of fancy tricks on your home page. Or if you just want to run Linux because you feel it's the cool thing to do. I have absolutely nothing against recreational CS-- that's where I started too. But if you want a real career out of it, take the time and get a real education.
Darned tropical millipede! What's it doing in our apartment?
Use your first 2-3 years, while you still have some time, to train your brain. Get a tough course in math. Something like group theory. Seriously. If you can get through it, you can learn PHP or Ajax or whatever will be hot in 4-5 years.
I am not saying that you should neglect the regular IT curriculum, but you need to learn how to learn new things. Math is pretty good for it.
Absolutely. Learn the theory first. Once you know the theory it can be applied in practically every language out there. The language doesn't (always) matter, the *idea* is what matters.
Well, based on your post it looks like you want to build web based applications probably on unix platforms if you are interested in Unix and Perl. Where to start... well yes it is overwhelming, but with a little time and patience you can get there.
I read the other comments and felt that they did not provide enough information to get you started, or were perhaps to vague or abstract for a person to understand -especially if they are not programmers yet.
This is what you need to do if you want to be really good at these technologies:
First of all, you need to understand basic program theory before you can begin. The best way to learn (without having to take discreet math courses and classes on logic) is to learn a contemporary object oriented programming language.
I personally recommend learning C++. By default, it is very simple but grows in complexity is you start to progress. In addition to this there are many great simple programs to write and algorithms to study as you go along. It is strongly recommended to purchase a thorough in depth book on C++ with small exercises. One book that I am not overly fond of but does do the trick is the Deitel books.
I prefer C++ over Java (for learning btw) because it is more strict, involves more micromanagement, and clearly indicates and teaches you about memory management and pointers and so forth later on. C++ uses explicit ways about this versus C# and Java has some implied rules. In addition to this, your first tutorial will not all of a sudden force you to define your own class and merely focuses on the basics. C++ also forces you to learn and understand scope issues, referencing, creating dynamic data structures and so forth without using prebuilt containers. (yes, there are prebuilt containers using STL, but once again, this is for tutorial reasons so please don't bash me here) Also try building your own data structures, sort algorithms, graphs, recursion, and hashes as these will help you to understand more advanced container classes later on in your programming career.
Once you fully understand C++, you can then proceed to higher more easier languages and you will be able to understand and learn them with great ease, since c++ was perhaps the most difficult way (unless you were using assembler or writing your own microcode and working with control stores).
After learning C++/Java/C# whichever you did choose, I would recommend reading up on relational database theory. This is a very important staple for any new technology that you would pursue and it would be in your best interest not to gaff this topic. Then start writing some sample app using your c++/java/c# skills to interface with some kind of SQL server whether it is mySQL, Oracle, or MS-SQL, it really does not matter for learning purposes. Please, try to stay away from Access when you are learning, this program teaches you bad habits on using relational databases as its wizards help to try to make things easier and ends up screwing you over in the long run. Seriously though, you need to have a very strong understanding of relational database theory, the use of joins, foreign keys, primary keys and what not.
During that time you have been taking breaks or trying to figure out how to compile code and use IDEs, try working on Unix or Windows and understand the command line and some scripting including shell scripting and the mighty PERL scripting language. (Perl is great btw) For windows, I would still recommend using Perl or VBScript (you can download PERL for windows at activestate.com)
Why do I recommend Perl? Perl is a very simple easy and powerful text parsing language and can be used for CGI. Also, later on you will have to make a choice between using PHP and ASP/ASP/NET this is largely going to be decided on your OS of choice, but if you choose PHP, you will find that it is very similar to the PERL language.
After mastering rdbms and your contemporary OOP language, you can either try to learn PHP or ASP/.NET. Be sure to lear
Consider "real" engineering (mechanical, civil, even electrical). Many old-timers in these professions are retiring/have retired. Based on input from my discussion group, there are not enough people getting into this field to replace the out-goers.
With the current generation's "pre-installed" computer knowledge, we need more people to get into the traditional engineering disciplines. It's hard and you might not be in an office every day, but this is going to be a booming area soon.
If you have highly-developed computer/programming skills already, all the better.
You're giving it too much credit. Every review I saw contained the phrase "worst math book ever".
One bite at a time.
It's actually a personality "trait" when you often find things too overwhelming to just dive in and start. I have it, and it's something you should talk to a specialist about if you want to save yourself years of difficulty before you learn to overcome it on your own.
That said, computer technology and programming is truly one of the most complex systems mankind has ever created. Don't feel bad. Just pick a language and start working on Hello World. You don't have to be able to write your own Sockets interface right away.
...and see where it leads. it might lead you to databases, or web apps, or binary apps, who knows. scratch your own itch, as the saying goes. you're right that everything leads to everything else and it's all intermingled. don't worry, just jump in somewhere and learn what you need to as you go.
Dear Slashdot: next time you want to mess with the site, add a rich-text editor for comments.
The book by Ross and Wright is quite good.
The mediocre reviews at Amazon are likely at anomaly.
Ask yourself this: do you learn better working from the particular to the general, or the other way around? Most of the posts so far have talked either about learning specific languages, or about going to school & getting the big picture first. Both are viable approaches: if you start by learning, say, PHP, you'll quickly find yourself moving into other areas: general Unix stuff, compilers, databases. Eventually you realize your code could be better, and you start learning more theory, maybe even go to school. Or you can do it the other way around: go to school first, get the theory, and then find ways to apply it. Personally I find learning theory in the absence of practical experience to be pretty tedious, but if you don't, it might get you where you want to go more quickly.
... if you want a job, the diploma or degree can be pretty helpful. But that's a different discussion.
Of course, this is about learning
Many will probably disagree with me on this, but I would say one of the first things you should do is learn C. You don't have to learn all the details of it, just enough so that you can look at someone's else's sample code and understand what is going on. There is a lot of sample code out there on the net and a lot of it is in C. (You should at least know what a pointer is and how to use it.)
In addition, many other languages borrow from C's syntax (prefix operators, for loops, etc). Knowing the syntax will help you pick up the others more easily. Plus there's a C compiler for just about every piece of hardware out there. (Wanna program a GameBoy? Ya do it in C.)
JoelOnSoftware also has some good articles about what you should learn as well. (Although some people disagree with him.) The forums at his website would be a good place to ask this question too.
Coder's Stone: The programming language quick ref for iPad
Do you teach an auto mechanic mechanical engineering? Or a cook biology?
Both of these books would be overkill for 99% of IT workers and 95% of programmers. It is this entire mentality that makes modern CS programs in our universities so useless to the industry.
While every CS graduate can tell me how many cycles an algorithm will take or how to do a proof in prepositional calculus, they can't tell me how to do kernel level debugging, or how to manage a 100,000 line of code project. Programming companies hire CS graduates because they are trainable, not because they are a useful product once they graduate. But CS programs don't have priority in hiring for prospective programmers. In fact, ~50% of the people who have degrees in physics work as programmers. Why? The same reason--they are trainable (and if they have a degree in physics they are probably very smart).
All of your elegant code means nothing if it takes forever to write it (and it does). When you are on deadline you had better learn the art of the hack. If this means mixing C, Perl, and Visual Basic (gasp!) then you do it! If this means using bloated already written software then you do it. And if you can do all of this while still keeping it clean, organized, and fast, then you are a programming guru. And they don't teach how to do that in school.
I know it sounds corny but when you trying to learn something just do it.
Right now I am getting into Solaris 10 so what I did today was I debugged
a nfs problem using Solaris DTRACE (I traced on fbt:nfssvr:rfs4_op_access
and output the uid/gid in the credentials) and played around some with
Role Based Access Control. Okay so I do have more than a decade of
experience in UNIX-like operating systems, but back in the days I was just
playing around with Ultrix-32 on a VAX.
I think "playing" around with stuff is the keyword here. Other people cut
themselves minor to semimajor projects do whatever works for you but by
all means get physical, get hands on.
Last login: Sun May 28 05:21:33 2006 from llb014
gd23ka@conco51:~$ ======== Player 1 Press any key to begin
What you're trying to do is somewhat akin to trying to understand paragraphs before you know how to construct a sentence or before you have an adequate vocabulary. An intro to CS class will provide the grammar and basic concepts that you can then apply to all these high level things.
I'm sure some anti-school posters will tell you just the opposite, but you should remember that schools are only as good as the teachers and your willingness to learn. CS classes developed to provide structure to what seemed, even in the 80s, like a vast quantity of unregulated knowledge. A year of classes at your local community college may provide more help than three years of wading through newsgroup postings and online tutorials you don't entirely understand.
If you want to start with a higher level language like PHP or Ruby, that's fine, but at some point you should go back and learn C/C++ (IMO you can just do C++, but you should do non-OOP C++ first, e.g. no classes). Understanding things like memory management and pointers are key to understanding how your programs work. Truly understanding a high-level language involves knowing partially how that language works under the hood, and the interpreters/run-time environments are almost always written in C.
The other area which is key is data structures and algorithms - which data structure and which algorithm to use when. These days you almost never have to actually implement the algorithms themselves because they are included in the language libraries, but you should understand how they work and the advantages and disadvantages of each.
Contrary to what some people have posted, I don't think learning assembly these days is worth your time.
The space unintentionally left unblank.
That's pretty much the worst (and really elitist) advice I've seen regarding what to start with in IT!
If the questioner can't even decide on what technology to learn (not knowing the dependences of AJAX on Javascript on HTML, etc) recommending a Discrete Mathematics book is a complete waste of time. That's telling someone to learn how to drive a car by researching SMELTING. You are assuming they will ever make good use of such high level concepts (as far as American college students are concerned) which is a very small % of the population...even IF they are interested in learning IT.
Often wrong but never in doubt.
I am Jack9.
Everyone knows me.
Those are good subjects to learn. There are also many hundreds of other important subjects to learn, so choose carefully. I disagree that theoreticians write the most elegant, efficient code, but there's no point arguing this point here for the zillionth time. Knowing more is better than knowing less, so in addition to the many other things you will need to learn to write good code (the most important of which is the domain in which the code operates, which usually has nothing to do with computer science), you may as well learn discrete math and automata theory, among a dozen or so other core topics in computer science and numerous important topics outside the field.
The advice about English is also important (although it probably wasn't a good idea to lead into that point by misusing the word "simplistic"). If you can write a coherent, accurate paragraph on anything remotely complex, then people with money will fund your projects, and not those of the 90% of your colleagues who are borderline illiterate. (This is not specific to computer science.)
...the power of the college experience. Learning to deal with people, learning the basics of language (English, whatever), arts, mathematics, etc. carry you through life. The best programmer in the world is useless unless he/she is able to convey thoughts, work well with people and know where they came from and where they (and everyone else) is going. Don't put TOO much weight in certifications, they are nice, and sometimes necessary for certain employers, but the biggest hiring point is knowledge and a proven track record of other projects.
One more thing...if I've learned anything about programming, it is to work for yourself whenever possible. If you are good at any one to three languages, there is work out there, and it will find you, specifically when you have the attributes layed out above from the college experience.
including this one.
The correct analogy is "suggesting someone learn about smelting, in order to build a car".
/corrected
Sorry about that.
Often wrong but never in doubt.
I am Jack9.
Everyone knows me.
The computer-science programs at Carnegie-Mellon University, MIT, and Caltech aggressively teach theory but require their graduates to complete several massive computer-programming projects before receiving a bachelor of science. The moron claiming a dichotomy between theory and practive is just plain wrong.
Though Google is a viciously anti-American company that prefers H-1B workers, Google did indeed succeed by hiring PhD's from places like MIT. Most of the employees at Google, before the IPO, hailed from such universities. If you are using Google, then you are using computer code that was hacked by a highly-gifted computer scientist skilled in the science of computer science.
The distance between information technology and computer science is much smaller than the distance between cooking (i.e. cooking food) and biology.
You dumb moron.
Forget about IT kid... I hear all the money today is in nursing.
Just go for a broad Information Science degree - that'll give you all the foundation you need in order to learn how to program. Luckily I pick up languages easily, to date I've got BASIC, VB, C, C++, COBOL, PHP, and some Python as well as a few dead languages in the mix.
But the ones I consistently use are VB and PHP. And while you might think SQL is simple - it isn't. It's a very powerful query language. Do a primer in XML too.
And if you go that route, the place to start is http://masm32.com/
Seriously, yes, try things out. Write your own mini programs, get involved in projects, try experiments to see what happens. Not everything has to be long and complicated, either - start by writing a Java applet that produces animation by colour cycling, for example, or a simulator for a very primitive, fictional microprocessor. In fact, pick anything that isn't too trivial, but would actually be interesting for you, and write it.
For networking, practice with Zebra or Quagga to get a feel for the concepts in network routing, then use something like NS to simulate a network with routers (you can even plug Quagga or Xorp in, I believe) and see what happens when you try things out. You don't need a couple of physical Cisco routers and a dozen boxes to do this, you only have to run a program which shows you what would happen if you did.
If you want to play with a nameserver, that's even easier. Start by doing a zone transfer. There are some public zones out there, and they will give you a feel for how zones are laid out. Now create a zone of your own. Add a hook in the master file to point to the DNS server you usually use, modify your resolver to use your local DNS server and modify your DHCP client settings to NOT pull the DNS information. Reboot your machine. If you can still resolve IP addresses, you are the proud owner of a fully-functional DNS system.
When doing any of these, remember that what you are learning is the syntax and the semantics. There may be better ways of laying things out, or logically composing things - that's always going to be true, though, so don't worry about it. Courses are great for learning theory, and theory will tell you about the composition part.
You MAY hear lecturers talking of people learning "bad habits" when they are self-taught. That can happen, but the only time it is really true is when the person has forgotten how to learn. Forgetting how to learn is the ultimate in bad habits in IT, because things change so quickly. What was true may be false or purple a week later. You just don't know. For that reason, being open to change and understanding that change is a very important part of the field.
The only absolutes in IT are:
It's a small world and it smells funny; I'd buy another if it wasn't for the money; Take back what I paid (SoM)
And by "wheelwright" I mean someone who's training was made obsolete by technology
First, pick something else you're interested in and use this as a focus for your studies, because the technologies you mention are almost random. If you don't have a reason for doing what you do other than "this stuff is cool" you're never going to learn anything. Like games? Start making games. Like online communities? Make one of those. Whatever, but you've got to have a direction.
Next you need to learn more meta-technology than actual technology. Any specifics you learn now will be obsolete soon enough. Learn enough of the generalities (What programming is, how a markup language works, file systems, databases, etc.) How to do that? Well, ironically you need to learn a specific programing language. Pick one. Everyone here has given a million suggestions, but it doesn't matter. But do take a couple college level courses.
But beyond those courses don't try to get a degree, at least if you have some personal motivation and discipline. Take that money you'd spend on college, get some nice equipment and a cheap apartment and get to work. Figure out which of those acronyms you mentioned are most useful to what you like to do and climb inside.
Technology is about problem solving (and patent disputes), so start solving problems. Get in there and apply your knowledge to a problem. If you have trouble, learn something new and apply that. Virtually all of my current skills have come from teaching myself something after being presented with a new problem. What Ilearned in University 15 years ago was obsolete even when I was there. (Schools don't have the money to be competitive in technology)
If you are not willing to learn new things continuously, and are going to complain about your knowledge being obsolete, then IT is a very bad field to get into. If you just want to dick around in technology, find a different career and be an IT hobbyist.
... starts in knowing yourself, in my opinion.
I think it depends on what you are pssionate about. Would you like to exercise more creativty? Try multimedia/web. Or perhaps you'd be more interested in tweaking machines. Then a track in system/network adinistration is for you.
There are a good deal of skill assessment tools online (e.g. brainbench) which can guide you what's a good path to take.
Need a color? Try 100 random colors
Michael Jordan gave a famous speech on how he got so good, and simply he said "drill the fundamentals." While other guys were learning all the fancy moves in college, he just drilled the basics of dribbling, passing, etc. and that (the basic mastery) is what allowed to him do so well at the game. This "drill the fundamentals" principle applies anywhere, be it law (studying justice and procdure), economics (understanding incentives and how money works), or IT/computer science. I argue that the fundamentals in IT, the things which are ALWAYS persistent and important no matter what you do, are as follows: 1. Basic code. Familiarize yourself with basic programming concepts. Get an intro to Java or C++ book. If you get down what's in one of these, you'll be able to understand the basic nuts and bolts of 90% of whatever it is you're doing from now on. I've got a guy in my office, he's been cutting code for 30 years and he still hasn't taken the time to learn recursion. For the uninitiated, this means a lot of his code is fundamentally terrible, and about 4 times as long as it needs to be. 2. Hardware concepts. Most IT stuff doesn't require much hardware know-how, but definately understand how it all works. When your software is doing a billion operations a day, fractions of seconds in data transfer rates add up fast. I'd say don't bother yourself with math or physics at this stage. That's like saying you need to understand organic chemical reactions to master rollerblading. Yeah, down the road your diet might matter, and there are a handful of people who specialize in this, but for right now it doesn't. Same with advanced math and phsyics. I'm writing this from off the top of my head, and might not even agree with this tomorrow (except #1. Definately learn basic coding principles). Anyone else have any (better) ideas for IT fundamentals?
You want to have an understanding of topics like these, and the degree of your understanding thereof is a good measure you can use to gauge your progress. This means that it's good to pick up a couple of textbooks on databases and compilers, to read them through, and to revisit them. Chris Date's database textbook is a good one, and there's others.
Are you adequate?
Learn math, specifically, learn the language of math. Then purchase a few books on algorithms and computational theory and data structures and read them. Complete the exercises. Test yourself.
Then, learn how to plan to code while you actually learn to code. For every developer who has the genius to simply sit down and write fully functional, self documenting code I can show you 50 who would be absolutely lost without properly planning what they're doing and how they're going to get there (and 60% of that bunch will still be lost even afterward). Learn about design patterns and object orientation. Familiarize yourself with these concepts and the concepts they refer to. Then when you've got that down, learn about database design and familiarize yourself with at least SQL, because even the smallest programs nowadays tend to use some sort of database connectivity. When you begin to think in terms of how to solve a problem instead of thinking about the syntax you're going to use to solve it, then you're getting there, and it separates the 5 year burnout from the career developer.
Quick example: you're a PHP programmer, and your boss wants you to develop a login system for the company website. What information do you need to have?
Well, is there any existing and perhaps unused functionality in the website architecture that you can use? If not, where's the login info to be stored? How is it to be stored? What database connections do you need? How many people are going to be hitting your site? Do you want to use cookies or sessions or both? Do you want the user to be able to save his password? How do you prevent people who have logged out from viewing content? What if they forget their username? What if they forget their password? Do you want to have multiple levels of administrative access on the website? Do you want to be able to ban ips? If so, do you want to handle it in your code, or do you want to handle it with your OS's firewall? Are you using cookies or sessions or both? Are there best practices you should follow?
And so on and so forth. Some of them are basic, and some require a bit of thought. Even though I can get that done in my sleep, I will still always document what it is I'm going to do and then give it to my client beforehand for him to review so that we're both on the same page and I can justify my time if needed. I also keep an evergrowing book of documentation with me that contains the issues that I ran across on past projects. If I've encountered it in the past (especially if I'm tackling the same type of project as before), the info is in there. It helps me to ask the right questions to clients and to avoid earlier mistakes.
When you develop software professionally, you aren't just writing it for yourself. You're writing it to do what your boss or client want it to do, and so that you and your fellow programmers can understand what your intent was with each part you developed, and so that the people who come after you and have to maintain what you wrote can understand it as well.
The best approach to learning information technology is to first learn the foundation of the technology.... Once you have trained your mind on the fundamental theory, you will discover that most information technologies are quite simplistic.
By your logic, one should begin learning French by studying the history of French linguistics, cataloguing the phonemes/morphemes, and diagramming the inflectional forms. What a wonderful approach, you'll be speaking French in 5-10 years tops. Sure, you could get some language tapes (or just go to France) and pick up conversational French in a few months, but what's the point? Really, if you can't appreciate the intricate tongue movements of a voiced alveolar fricative, you're nothing but a grunting house-ape.
Once again illustrating the divide between theory and practice.
Democracy is two wolves and a sheep voting on lunch.
Start with the one and only: "structure and interpretation of computer programs" (http://mitpress.mit.edu/sicp/).
The sooner you fall behind, the more time you have to catch up.
Good suggestion! I would supplement it with the following as well:
1. Episodic Learner Model/An online Lisp tutorial
2. Common Lisp: A Gentle Introduction to Symbolic Computation
3. How to Design Programs
4. Practical Common Lisp
5a. The book - Structure and Interpretation of Computer Programs
5b. The movies - Structure and Interpretation of Computer Programs
6. Loving Lisp - the Savvy Programmer's Secret Weapon
7. Common Lisp the Language, 2nd Edition
8. On Lisp
9. common lisp: a web application tutorial for beginners
10. JavaScript: The World's Most Misunderstood Programming Language
11. Free JavaScript Learning Center
12. JavaScript for Scared People
13. JavaScript Closures
14. Why's (Poignant) Guide to Ruby
= 9J =
If you want to program for web, learn about HTML, PHP, CGI scripting, etc. If you want to write applications, learn a procedural language C, C++, even Pascal, and read up on how the hardware works (e.g. what is a register, how pointers work, etc.). There is no best way. But take the time to learn some of the fundamentals. Data structures, common algorithms, etc. Even if you don't end up using most of them, they'll help you structure your thinking. And ultimately, the choice or programming languages or programming model does not matter. It's how you think of the problem, and how you go about solving it.
There are 10 kinds of people in the world - those that know binary, and those that don't.
You are right; the list of available technologies is daunting. Worse yet, the list are continually changing. If you concentrate on a specific technology, when that technology falls out of favor what skills can you carry forward? Also consider your career ten years from now. Assume the current rage is a technology which has only been available for 1-2 years. Ask yourself why an employer should hire you at a higher rate than a recent grad with the same amount of experience in the specific technology.
Some examples of engineering skills to start with are object oriented design, design patterns, data structures, design methodologies. There are some other good suggestions in other replies here.
You can choose areas of interest in which to specialize, but the specific technologies you are going to use in professional life are going to be determined by a variety of factors including best fit, employer constraints, technologies favored by your co-workers or senior developer/designers etc.
Finally, if I am looking for people to add to my team, I'm going to choose someone with good engineering skills and programming habits over someone who may have more experience with a technology but poor engineering skills. IMHO engineering skills are fundamental and technologies are incidental to an IT professional.
First you could start by learning the differences between learning languages, libraries, coding techniques and Information Technology knowledge.
I am putting myself to the fullest possible use, which is all I can think that any conscious entity can ever hope to do.
Easy. Start with calculus, then electricity, digital systems, turing machines, register machines, read the verilog source of a processor, digest the whole IA32 manual, then the Knuths (with all the exercices) then continue with C, compiler construction, OS design, UNIX, practice procedural/oo/data-flow/logic/functional/message passing programming with an assortement of C++/ML/Prolog/LISP/, read a lot of source, read introductory material on databases, computer graphics, networking, GUI design, etc..., skim through RFCs, read the whole o'reilly catalog, and... that's it !
The sooner you fall behind, the more time you have to catch up.
Make sure that you do *not* rely on Ask Slashdot for information.
maybe if you had any clue how to pitch your resume (great, skills and languages- what does that mean to HR people?) you wouldn't be bitching so hard.
and you seriously didn't use a computer before 2001? that's just like... weird.
and that website, man? don't show anyone that, ever again.
Unions have apprentices. My mom was an apprentice in the Carpenter's Union for a little while.
"Things like HTML, Javascript, and SQL are like English, but then again, they're basic."
Not to give you a hard time, but don't write these off because they are perceived to be simple. There are many, many hours that should be dedicated to learning how to use all of these 'basic' skills properly. If you want to be good at coding, the best way to differentiate yourself from others is write good code. That means knowing which javascript works across browsers, safe and efficient ways to write the same SQL (or even better stored procs, triggers and functions), and proper CSS used with HTML.
And, if your into web-based technologies like those, it wouldnt hurt to check into some XML with XSL Transformations (XSLT).
But if its just the basics, I would also revert back to C and C++ like others have recommended.
Java is pretty neat also, and may or may not be easier then C for you. It was not for me, but I was taught C first.
From your question, I take it that you want to specialize in programming rather than networking or any other areas of IT. (IT is such a generic term that literally encompasses hundreds of actually professions.)
As a student programmer, I can say that what you want to learn are concepts. Every language shares some basic characteristics with all other languages. Loops, output, input, classes, etc. Once you learn the concepts, you can pick up most languages very quickly.
Don't get locked into learning a language or two. I often laugh at jobs where they want a specific set of programming knowledge. To me it is like asking for someone who can use Outlook Express, when what you really want is someone who is familiar with email. Sure I know Outlook, but I can guarantee you that I can learn any email client an employer will use. Simpley because there are certain email concepts that are common to all clients. Stating that you know C++ will get you characterized as just a C++ programming. You want to be known as an overall programmer.
So where do you learn the concepts? There are many beginner books at the local book store or on Amazon. I went to school to learn, and it works for me, but I probably haven't learned anything that I couldn't have learned from a book on my own. I just wasn't a structured individual who had the self discipline to learn on my own. I needed a school environment to get me started. If you chose to go to school to learn, don't worry about the source. As long as the school is regionally accreditated, you are getting a respectable eduction.
But as with any education, don't think a degree alone will be your meal ticket. Schools are great for getting you started and giving you the leg up. You will continue to learn new languages and techniques long after you have a degree. It is by your over all knoweldge that you will judged. Likewise, if you chose some technical school with a less than stellar reputation, don't worry. Again, your knowledge is all that will matter.
I would avoid doing any work for outside parties, at first. Your reputation is the strongest thing you will have going for you. If you try to jump into commercial work too soon, you will get a bad reputation because you don't know enough. So even if you learn more in the future, you will still have the stigma of the person who didn't know how to access the SQL server from C++. Wait until you feel like you have studied enough. I personally measure my progress against other students who have done commercial work, to determine at what point a company might find me valuable.
Learn graphical programming as soon as possible. The basics of every language doesn't include GUI work. Sure you will learn to make text programs, but no one will be impressed with that. After you have a good grasp of classes, I would specifically seek out books and material on graphical programming. Graphics aren't just for games. You need a GUI for any program you make, in order to be taken seriously. Basic programming itself doesn't include anything more than text based processes.
Lastly, just have fun with it. If you love programming and learn fun things, you will keep going.
"That's telling someone to learn how to drive a car by researching SMELTING."
I see it more more like telling someone that they should know the basics of physics before learning how to drive.
As for which technology to start off with - that is a stupid question - I will explain why.
I recommend starting your education with IT at a prestigious university. Stay away from community colleges and the like--go for a Computer Science degree.
There are two facets to learning about learning IT: learning the technology, and obtaining a job. Getting a prestigious degree will open doors; getting a community college diploma will not -- this I speak from experience.
As for which technology--learn the basics first. As you advance, and learn the fundamentals of programming language, you will realize that learning the technologies is irrelevant. Once you have a firm grasp upon the foundations, the programming languages themselves are easy to grasp; there are merely a set of syntax of existing language paradigms.
Back to the community college aspect. Atleast in Canada, if you get a technology degree from a community college, prepare to be unemployed. Community colleges IMO are shit; they offer a lot of bullshit diplomas in a lot of bullshit. Prestigious universities on the other hand are of a higher nature and will open doors for you. Since I've been in a prestigious university (I attended after community college), I've had work doing bleeding edge work in Bioinformatics and Geographic Information Technology; however, had I simply stuck with my community college diploma, I'd still be washing dishes in a restaurant.
As for where to start - you have to start at the bottom and work your way up the education latter. There is much more than simply learning a technology; any monkey can do that. It's the software engineering practice/principles and experience that are valuable.
As for Slashdot--a lot of denizens here are anti-social nerds (people who excel in technology, but have otherwise failed in all other aspects in life), so take their advice (including mine) with a grain of salt (or less.
My advice would be to go from UNIX adminning to full blown programming.
STEP 0. Learn basic UNIX sys-adminning by installing a Linux distribution and then studying how it goes from boot to login prompt.
I suggest you use Arch Linux. Along the way you'll learn about: reading on-line documentation using 'man', basic TCP/IP networking, basic user administration, directory structures and file systems, running basic service daemons like ssh, apache and ftp, basic computer security and basic text editing (use pico/nano instead of vi).
DO NOT INSTALL A GUI/Desktop Environment like X11, GNOME or KDE yet. This will help you focus on the adminning of the core OS and give you an understanding of how GUI's are seperate entities from Operating Systems.
then...
STEP 1. Learn the basic concepts of 'structured programming'. Important to realise that these are _principles_ - they aren;t tied to a language per se.
At the minimum, you need to learn about: 1. control structures like if/then and while, and 2. the basic data-structures like variables and arrays. I'd suggest you use C and the BASH shell to learn this.
Using C well that's a no brainer. It's the language of UNIX and it's still a very good language to know. I suggest you get Kernighan and Richie's classic book on C. You can also pick up one of Wirths books on PASCAL or Modula 2. Not sexy languages, but particularly Modula 2 has the structured programming stuff very well implemented.
Caveat on C: Working wih text is going to be a pain till you move on to something more suited for humans - like Python or Ruby - but you need to understand structured programming first.
Tip when learning C: spend some time with Structures. The concept will help you better understand Object Oriented Programming when you get to it. If you're interested in actual computer hardware and architecture, then probe a little deeper into memory management using Pointers.
Using the BASH shell will help you appreciate that 1. not all programming is elegant and 2. that the basic principles are found in many different forms. As a bonus it will 3. tie-in nicely with the adminning you've done in step 0.
then...
STEP 2. Install basic X11 and a windowmanager. DO NOT INSTALL a Desktop Environment like GNOME or KDE yet.
Follow the start-up of the X11 system through its configuration files. Use X11 over a network running a program on one machine and displaying it on another. choose a window manager you like and configure it.
All of this will help you understand the layered nature of modern computer systems. And choosing a window manager is fun. It will also introduce you to the concept of library dependancies, as most window managers need a bunch of extra lib to work. though Arch linux will help remove much of the pain.
then...
STEP 3. Install the TCK/TK language. This will give you a relatively painless introduction to cross platform GUI development as it runs without much modification on UNIX, Win32, and OS X.
There are pro's and con;s to TCL/TK, but in my opinion the pro's far outweigh the con's. You'll get 1. an appreciation of how badly canvas widgets suck in most other GUI toolkits. 2. an insight into how there is a split between the visual and algorithmic part of coding 3. you'll be able to write complex GUI stuff in very little time, which will make you feel good even though you're still a rookie programmer. 4. Python uses Tk as its default GUI widget set, so if you decide to learn Python in step 4 you'll already know how to use the standard GUI bits in Python.
then..
STEP 4. Learn the basic principles of Object Oriented programming. Choose Python or Ruby. Python is good because it's good and you've already learnt Tk. Ruby is better because it's better and it'll set you up for AJAX web stuff when you get around to Ruby on Rails.
Again master the basic concepts of OOP: Classes, Instances of Classes, Inheritance. Polymorphism etc. Start out with reading wikipedia and follow the a
- It took western civilisation 2000 years to ensure popular literacy, and now we work with icon driven GUI's. Go figure.
Just do a search either on google or just on slashdot. This particular topic (or highly related ones) seems to pop up on this site on a weekly basis. I can't imagine any of the 150 or so posts in this thread is going to add anything new.
Just tired but after 35+ years programming.. Forget the languages, easy. Try to get some idea what ( and how ) you want to do. Yes - different languages have different schematics - and that's all. The language really isn't the the problem, how and what is (IMHO ). Maybe it is just me but I see no difference in any dialect ( a language term ) except one is more suitable for the task in hand than some other. You can do all you want in 'C' or in COBOL or Python or FORTRAN or DELPHI or C# or REXX or TK/TCL or plain old assembler or ... ( and even in VB. ) Actually a memory address calculation in COBOL is easier than decimal arithmetic in 'C' ( think financial applications, money! ) or that FORTRAN compiler generates much more efficient code for cluster / parallel systems than any other or that LISP is a perfect solution when you need a flexible system that can bootstrap itself - so, it really depends what you want, how fast, and .. - now the problem today is if it can be supported, not too many people know APL, TAL, BAL, Prolog, ... ask about SNOBOL, RGP or if you go to modeling, how about SIMULA ( OO anybody ? ) So - SQL is easy if you know relational algebra, HTML is just a presentation, Javascript is ???, and so on. Unfortunately ( IMHO ) most coding has gone how to use API, not how to solve a problem. Once you learn how to solve a problem the language really can be whatever you select or in worst case whatever you are required to use. So have fun - I have had ( and still do! most of the time.. ) But don't forget - coding is like a data entry or a ghost writer job - someone else tells you what to do. Maybe not what you want in future. Nothing against the very skilled people doing those jobs ( under rated IMHO ) but not for me, hown about you ?
- Squeak Toys
- More Squeaking
- Very fast implementation
- For grownups
- The Smalltalk Portal
Now for the Free Database of choice:-- Postgresql RDBMS
And the books to study:-- Free Smalltalk Library
- PostgreSQL Book
Get your head around that lot and you will be a very valuable item. Toss in a modicum of accounting knowledge to ice the cake.Everything mentioned in the above links is $ free.
Tutorials like http://pine.fm/LearnToProgram/ should be a good start for this.
That's the theme of the method I'd propose. You seem to have already chosen your primary target: web programming (AJAX and Apache and SQL and Unix all come together for that purpose). Now you need to chose the objectives for each sub-step to getting there. This, by the way, is similar to "functional programming", which you will use quite frequently, so it is rather fitting that your educational plan mirrors that.
First, I'd build a foundation in your environment. In this case, Unix and Apache. This (as everything) is best learned by doing. Build a Linux box. You don't have to compile from scratch using Linux From Scratch or Slackware - you can use Ubuntu or Fedora. The important part really is that you have a representative example of your target environment when you are done - you'll be using this alot.
Move around in this environment, get comfortable with it. Gain familiarity with the command line. You can use the GUI, but since most production servers won't have one installed, you shouldn't rely on the GUI. The more you can do on the command line, the better.
With this in place, play around with Apache. Install it (if you didn't as part of the OS install) and look through the configuration file. It is well documented, but for the inevitable gaps, use Google and the documentation on the Apache website. To complete your playing with Apache, you will need to start down your path of learning HTML, but we're not there yet. Install a pachage for Apache - maybe a message board system or photo organizer. It really doesn't matter, just so long as it requires you to make changes to the Apache configuration. It will likely also require you to set up PHP or PERL or MySQL in order for it to function. These will have to be set up in such a way so as to work with Apache. This in turn will help you learn more about how Apache works (as well as the languages or databases you install). As an additional bonus, you now have source code to look at, and probably some HTML samples. So lets move on.
HTML comes next. It's quick to learn, and, like scripted languages, it is easy to edit and see immediate results - just save and refresh your browser. There are a ton of HTML resources on the Internet - again, Google is your friend. Look at a site and make prodigious use of your browser's "View Source" option. One of the best ways to learn is to look at other people's examples and make changes from there. Here is where Open Source can really help, because it is an endless supply of examples. Keep in mind, not all of them are good examples, but here is where learning resources on the web or at a school or from a book can help you keep from learning the "wrong way" to do things. An HTML style guide would be good here. And you should then choose an objective - a project, if you will - to achieve. Don't be too ambitious, but design and create a small web site using as wide a variety of HTML knowledge as you can. Start simple - fonts and background colors, images and links, then once you're comfortable with that, expand the site to include tables and style elements, and finally move up to style sheets and CSS. Build them by hand, of course. You can't learn HTML if a tool is doing all of the heavy lifting for you.
Now, let's move into HTML. Others will say you should learn a "real" language first, like C or Pascal. But the reality is that you should learn a language _right_, then the choice of language becomes less important. C and Pascal are very structured, which is why they are often used as introductory languages in college (or even high school) curriculums. While it is still possible to program in them incorrectly, they tend to be more strict than other languages, especially interpereted languages (basic) or scripting languages (PHP, PERL). Though I still recommend prodigious use of example source code for learning these languages, I can't stress enough that you find a good book or two that will encourage you to program correctly and teach you the difference between good and
Oh, was that my outside voice?
When I was in university, one of my professors told us that 90% of engineering problems can be solved with 1st year concepts, since they were the foundations of engineering, and I believe that to be true.
But Discrete Mathematics and Finite Automata and Computability were not part of the 1st year curriculum, and for good reason. These aren't fundamental concepts. They may be useful, and they may teach you to think in an abstract way, but they're also actually fairly advanced, and you won't need these often in day to day operations.
If someone were to learn programming, I'd recommend 3 areas of learning. First, programming languages. You need to learn the language without worrying about things like data structures and algorithms. Learn at least one scripting language (Perl, Python, Ruby, etc), one functional language (C should be the one, considering its importance) and an OO language (C++ or Java).
Second, you need to learn about general programming theory. THIS is stuff like data structures and algorithms. This is probably the most important material you need to learn to program, since this is what you need to solve problems.
Third, you need to learn how computers work. And for that, there's only one thing to learn: assembler programming. I'm not suggesting you learn how to write full applications in assembly. But you should take at least one course in that language to help you understand how your C/Perl/Java code gets executed by the machine. It will give you a good understanding as to how memory and other hardware relates to the CPU, and how the CPU can take a for loop and run it.
Good luck
Phemur
As you say "'s overwhelming to start"
So, divide and conquer. First, you should try to select a subfield. There are at least three major branches (WARNING: a lot of corners cut, and (slightly) exaggerated):
I would guess that, for you, the choice would be between Programming and System Administration (I do not think those fit for CS would ever pose this question; a programmer who keeps learning can (almost?) become a software engineer)
If you lik to get things done, Programming is the better choice. If you like to continually improve things without ever finishing it, System Administration might be a good choice.
Python first. You use it as a procedural language, or an object oriented language. It is incredibly easy to read.
learn the basics. make a few console (text input) based programs.
play with the object oriented side of things. Do some simple bits and pieces. understand classes and subclassing. don't worry about the fancy clever stuff yet.
read about data structures. think about it, try and use some.
Get confident with writing simple code, then look into building a GUI version of one of your apps.
Then, now you have a taste for programming, decide how you want to progress and follow the path!
So true. I've worked in several big manufacturing/financial companies which recruited sinificant numbers of graduates each year into there IT department as trainee programmers. Indeed I was one myself and progressed up via programmer/analyst through systems analyst to project manager in that environment before heading off to run my own consultancy.
A common theme in all of these companies was that they were biased against Computer Science students. Instead they'd recruit from any discipline (the apptitude tests took a full day at least in all cases). Whilst they were after good coders, what they wanted more was rounded individuals who could talk to the business people and develop systems to help them. Indeed given the choice between a brilliant coder with no people skills and a good coder who could interact well with people the second would win every time.
The bias against CS graduates was that they tended to be totally focused on code and not considered the wider perspective. The better recruits in fact tended to be language and bioscience graduates - probably because both these disciplines require a logical mind but with more flexibility than say Physics or other hard sciences (or the the opposite extreme of the humanities and arts).
Your milage may vary tremendously of course. Obviously the above considerations would not apply in a software company, or a hardware manufacturer or an ISP etc. etc. But by no means every IT career exists in such a hard environment, and indeed if you have good people skills you'd probably find it more rewarding not to be in one.
I have heard the "justification" for not teaching students procedural code before, and it doesn't make any sense to assume that another person is so stupid from the outset. It's like insisting that once a kid learns how to use a hammer and nails, that they can never possibly learn to use a screwdriver properly. It's condescending and somewhat insulting.
When I was in school we learned on (some version of) MS quickbasic, and then C, and then C++ , but in the C++ courses we re-wrote the older C-course programs into objects. I found it very illustrative to see an example program written both ways, so that I could see exactly what each had that the other didn't.
A lot of this sentiment (that procedural coding needs to be kept "hidden" from soft-minded students) seems to arise out of the observations that when they get hired to write methods, they try to write functions instead. And if that's the case, it's more a matter of disregarding work specifications or unfitness for the position than it is that they were "taught poorly".
-------
Also--the best beginner's Java book I have EVER found [at any price] is Java Programming: The Easy Way by Douglas Downing.
Every chapter tells how to do something basic like console screen output, window/GUI input and output, how to read & write files, get keyboard input, draw graphics and play sounds. Fun stuff that a kid can do on their own. It's out of print now and becoming scarce; I gotta scan my copy someday so I can share it easier. ~
I am sure there are a lot more but I think these would give you a good grounding, the rest is learning APIs, languages, religious arguments and experience.
The first thing you want to as yourself is: is this to gain academic
:)
:)
knowledge, or practical knowledge that will make you worth something on
the job market ?
The second question is WHAT part of the IT landscape interests you ?
You say programming, but I'll pointedly misinterpret your question
and focus on "IT".
Learning about IT is like saying, "I want to become a doctor". Are you
interested in programming ? What kind ? Systems or UI or something
else ? What environments ? Traditional (UNIX, Windows) or embedded
platforms ? High or low level stuff ? Or would you rather learn about
networking ? In general, or do you want to get a CCIE ? How about
systems administration ? Or DBA ?
Third, see if there's not some introductory evening courses you can take
in some of the subjects that interest you. A lot of IT courses will be
great to quickly discover a technology, a concept: there are lots of
advantages to being walked through a topic by a competent person, etc...
It will open up your horizon to different things, show you some of the
possibilities you might miss when trying things by yourself -- but in the
end, you have to burn for it. If you don't, in my opinion no amount of
courses or training will make you more competent than personal motivation
to do a good job.
Last, you want to find out if a CS college course is what you are
looking for. Don't get me wrong, lots of good people are self-taught
l33t d00ds with k1ill4h k0d3r sk1llz, but there's a lot of good
underlying theory to be had in formal programming courses, algorithm
design, systems architecture. There's many different areas of
specialization in IT, and some of them you can learn in college, others
not: for instance systems administration is something you'll have to
learn hands on, it's a combination of skills from different areas of the
IT world.
Anyway, here's a few biased tips -- I'm not a programmer
1. Don't assume Linux/UNIX and TCP/IP is the only thing out there. Windows
either for that matter. They are very close to each other in terms of concepts
and implementation.
2. Now, you said that programming is what interests you. Write code. Try
different languages. Learn C -- you want to get close to the system to
understand how it works. Even in the world of Java and C#, it's still a
very good idea to grok the underlying platform, and why it works the way
it does. It doesn't mean you need to learn assembly
There's too many people out there programming and making the lifes of
systems administrators and DBAs miserable, because they don't understand
the implications their code has on the underlying system (hell, if
you're programming for a personal computer, then you can allow yourself
to write on the product box "requires 4 GB of RAM, two Opteron 242
processors and 500 GB of available diskspace"), because they've been
told "Java is a virtual machine, you don't need to know anything about
the underlying OS".
3. Read some books of course. On OS design, "Design and implementation of
the FreeBSD operating system" (McKusick, Neville-Neil) is a good book,
though maybe a bit steep for starters.
For networking, Tannenbaum's, "Computer Networks" is a very good,
thorough work on networking technology, from signalling theory to
cabling to transport and protocols. For IP itself, read Richard
Stevens', TCP/IP Illustrated.
In the end, it will still be up to you to ask yourself: do I really like
this ? Do us a favor, don't become one of those career programmers who
decided to learn Java or C# because the pay is good and there are lots
of chicks. Wait, forget that last one. Good luck.
How To Design Programs
Pupeno
I can relate to that. I wanted that too.
So I started easy. I built a network of various types after scavenging old 386s.
Next I wanted various networks. Here at home I have a pile of FDDI, ATM, arcnet, tokenring switches, most of which I have setup and know well (except ATM). I also have a pile of ultrasparcs, an hpux workstation, an rs6000 too. I need to know all UNIX. At least be familiar with them all. I NEED an s390 (zseries) and missed a $500 zseries server on ebay 3 years ago for which I'm still kicking myself. I dont have a 600V power supply anyway, and I'll have to play with an AS400 first anyway.
So I realize and understand your requirements. The answer is setting rediculous goals. For me it was setting up the latest Oracle on each of the UNIX machines, interconnected with each type of network. Just GETTING to this goal taught me a heck lot although I never reached it.
Anyway I'm busy with work these days. Its a good job with lots of challenges. Tonight I have to setup two openbsd machines with CARP so that the two unreliable wireless connections (layer 3) can be made more reliable between two buildings. I dont have a budget for cisco routers to do the same, so I have to research learn and improvise.
If youre after web technologies, just setup a webserver and run a java app, a php webmail and portal, a ruby app and slashcode (to learn perl). Youll run into problems. Then youll have to debug it. That will force you to understand it and sift through it.
Of course you'll have to have a rudimentary understanding of these technologies first. Just build a basic php webpage accessing a mysql server on your computer.
"Give orange me give eat orange me eat orange give me eat orange give me you." -Nim Chimpsky
Seriously, GO.
You don't have to sign up or anything, just find the "Intro to programming" class, find a seat and listen. Do the assignments (you'll know if they're right because they'll compile and do what is asked. It might also be worthwhile finding a guru friend that can help you out. These can be found in Linux user groups and in the tech labs at the University)
In a lecture full of 400 or so people they don't check the roll and kick you out just because you haven't paid. You won't get a degree at the end of it all but you'll have the knowledge and that will make the degree a walk in the park if you decide to go back and do it.
If there's a choice between a procedural language and an object-oriented language, go for the object oriented one first. If there are follow-up courses in second year, take them too. Lots of the courses in second year such as "Data security", "Networking", "Operating systems" and "Machine Intelligence" rely on you knowing the language you learned in first year and extending your knowledge.
There will probably be a web-based subject or two; one where you learn HTML and Javascript (and maybe css), the other where you learn server-side scripting such as JSP, PHP or Perl (or one of many other languages.) These are great as an intro to the language but I would suggest while you are doing these courses getting an old machine to act as a server and learning the admin side of the web technologies. Set up a web server with server side scripting and a database and create a website. Write howto guides. I did that while I was at University and I found that the process of writing the guide helped me to understand the language far better than I did before. If they're good enough (and appropriate) submit them to tldp.org or just host them yourself. You can help someone else get through this easier than you had it.
There will also be some courses on the "Fundamentals of Computer Science" and "Algorithmics". These teach the concepts that will change you from an amateur hacker into a quality programmer. These subjects often involve little or no programming at all but what you learn is about how languages in general work and how a different algorithm can turn the fastest computer into a slug and another can breathe life back into a 486. I have personally written two programs that solve the same problem. One, a 486 could run through in an hour, the other would take more than 200,000 years on the Earth Simulator. (I don't think they'd let me run it.)
Most of all, as someone has said previously, do stuff. The more programming you do, the better you will get at it. The more languages you learn, the easier the next one will be. The more you tinker with your operating system, the fewer mistakes you will make. The more operating systems you use, the more employable you will be.
Sig matters not. Judge me by my sig, do you?
but... isn't that quite a good idea? If the person driving the car has no idea of how the car moves and stops, then they are in trouble...
From the things you list, it sounds more like you want to learn IS software, with a strong web applications bent, more than "IT". When ever I hear a coworker referring to IT, Information *Technology*, it tends to be more somewhere between software and hardware maintenance, than a programmer per say.
:)
Having said that, I personally think hardware is a good thing to understand, no matter how abstracted your work is from the hardware "layer". I think what the assembly guys are trying to say is learn something closer to machine code, so you understand the hardware you're resting everything on better. Sure, architects don't need to know how to make bricks, but they sure as hell need to know the physical properties of the bricks in their buildings' walls. Programmers of all stripes should have some basic knowledge of bit-logic and transistors. To the guys proscribing specific languages, need I remind you Object Oriented programming is more a design pattern than a set of languages? Sure, some languages (Java, Ruby) make it easier to fit OO patterns than others (C), but a good OO designer can make ANY language fit their OO patterns, even Assembler.
Starting fresh, I say the first thing you need to do is learn how to make a good flow chart. Flow chart anything, from your morning bathroom routine through your preparing for bed at the end of the day. You can plug flow charts in to any language -- just use the flowcharts to show your inputs, outputs, and conditional branches, before you need to write one line of code. Other diagrams are better for certain problem types. State machines are great for hardware work. Network diagrams are useful for networking and AI type logic.
Then learn design patterns. Make your flow charts Object Oriented, so you can re-use them and plug them in to different, larger flow charts, without starting from scratch every time. Learn widgets and factory patterns. No reason to get stuck on a specific language just to learn patterns -- a lot of books use real-world analogies (Starbuzz, Pizza Factory, etc.) for process patterns, pared down to specific languages. I say stick with the real-world until you absolutely need to use a specific language, or specific hardware for that matter.
To start slowly in coding, start with something simple, like HTML. Many argue HTML sans JavaScript isn't really programming, but a lot of the flow is there, and it's a good place to experiment with the basics. Block structures, attributes, hierarchy, order of operations, etc. And there's tons of example HTML out there -- just click "View Page Source" on any browser.
The next language to learn is up for debate. I would say it depends on the application you want to work on. If you're parsing text data, Perl and Python have some nice tools. For GUI presentation, Java, JavaScript, or even Flash and PHP are possible starting point for Web/file GUI presentation. Learn C and C++ dead last. They are very powerful and widely used languages, but their syntax is very bloated and counter-intuitive in some ways, for historical reasons. They're all easy enough to learn with some grounding in the basics. I would say Pascal is a good learning language for good coding habits, but it's kind of a dead language now, for other historical reasons. I personally started on LogoBASIC, but that's just showing my age too plainly.
Bravo! I agree absolutely. Suggesting an end-user learn Assembly in order to use a software application would be like suggesting someone learn about smelting in order to drive a car. But a programmer is the creator of a software application, and therefore the builder, not the driver.
-dZ.
Carol vs. Ghost
Why on earth should you waste time on IT? Your job will be outsourced anyway and you'll end up flipping burgers or wiping floors.
Study law. Become a lawyer instead. You'll make more money with less effort.
Computers are for chumps, deal with it.
It seems as though you've examined a purely functional programming language (Lisp), and a system-based procedural language (C) and assumed that all language are somewhere between those two rather than, for example, actually trying other types.
Programming languages don't fall on a single axis between functional and procedural. That's ridiculous.
If I was going to design a diagram like that, I'd have one point that's purely procedural and put Fortran (NOT C since it has a super-stupendous entirely functional macro processor that can do anything) at the far end, and Lisp at the other. HOWEVER, I'd also have an axis for environment versus compiled.
Fortran and C would be at the far end of that, but Lisp would *not* because it uses an environment to do its stuff less than, for example, javascript does (there is not even such thing as a javascript native interface). So now we're talking about a more realistic two dimensional system with programming languages that vary in how dynamic they are and how functional they are.
Then there's a *third* axis for orthogonality (this is important to note because in highly orthogonal languages, there's usually only one way to a specific atomic operation). I'd probably put SQL (the standard, not the one implemented by a specific DB), xpath and RISC assembly as the most orthogonal, with LISP and XSLT as close seconds. I'm not entirely sure what I'd put as the least. Probably perl, VB, and Cobol.
To go further, though, some programming languages have special characteristics that are completely missing (as opposed to the other things which have degrees of usage) from others, such as single inheritance, multiple inheritance, interfaces, closures, do...while loops, operator overloading, string concatenation operator, and the ability to describe hardware (which is pretty much exclusively the domain of hardware description languages).
I'm sure there are others, but those are the things I can come up with off the top of my head.
Mod me down and I will become more powerful than you can possibly imagine!
Start learning programming with a easy language like python. Just buy a easy book and get started.
.NET is the same thing. It doesn`t mather witch one you choose. Java is more mature and have a lot of books and free programs.
The next thing is to learn standard SQL. SQL in it self is not that special, but it is a must to understand databases in todays world.
Python will learn you basic object oriented programming. PostgreSQL will learn you standard SQL.
The next steps after this is up to you. It depends on your goals.
"Sams Teach Yourself C for Linux Programming in 21 Days" is a nice book after this if you would like to learn more about Linux and low level programming in general. It is genneraly a good idea to go this way after pythong and SQL. It will give you some basic knowledge to build on. C will give you knowledge about memmory and resource handling.
Next step after this might be Java. You can build further on your knowledge of object oriented programming (python), databases (SQL) and your basic understanding of low level programming (C).
Java and
MySQL is not a solution for learning. It is not standardized and it does weird things. What ever else than MySQL and MS Access works. Firebird, IBM DB2, Ingres, MS SQL-server, Oracle, Sybase and others is just as nice. PostgreSQL is free and easy to use.
And corporate style.
If you are going to work in a white collar environment, going and coming back to work everyday, - you know, the old style - then go for ms related stuff, and also unix, novell and the like ; the stuff most corporations got when the it was booming and now cant easily move away from.
If you are going to join the big family - ie, telecommute, or work freelance, or work for small companies in telecommute fashion, you know, the stuff most of us do - then go for html, php, mysql, javascript in this order and then get some ajax.
The reason is that, MOSt of the companies that are getting ecommerce sites, portal sites, publishing sites, - ie sites that will help their business - are small, they dont have their it division, it people, and they want the optimal solution. Php/mysql based software delivers them that. for example oscommerce have become a huge script, with its unlimited variations and adaptations. same goes for much other stuff that a small company might want, and in the same time php/mysql is very suitable and easy to develop apps from scratch upon. When done with php, there are easy endless possibilities of interfacing the script with other abundant scripts on the market, doing virtually any and all stuff.
Best way to work such interlinked technologies is to define a 'learning' project, and implement it. This way you will have to learn all stuff related, to the extent that they are useful - no more, no less.
Read radical news here
While there are many, many programming languages and tools you would be wrong to assume they are different. A good programmer can become productive in almost any language in very short amount of time. The best way to start programming is to learn how to program, in any language.
I recommend starting in javascript. In the summary you say it is a basic; this is true, but most modern languages are. One of the key differences between javascript and other languages is that it is not a strongly typed language (variables do not need to be cast to a particular type). This makes things easier in some regards, but difficult in others: it forces you to think about how your variable needs to work, which is a great way to get in to object oriented programming.
Sit down and write something complex in javascript. Something insane that other people have said can't be done in javascript. You would be suprised what it can do, and by the end of it (even if you don't succeed) you will have had a very valuable introduction to programming, particularly object oriented programming.
Once you have done that you can start moving in to other tools or languages. Your path should look something like:
- Javascript
- Regex (you can use regex in javascript)
- XML + XSLT
- ASP or PHP
- SQL
- ASP or PHP + SQL + XML + Javascript (aka basic AJAX)
- Java
- Java + SQL
I feel your direction to the question is wrong. You need to get yourself pre-educated on technology before you go to school on it. Start off by writing yourself simple programs and little games Get use to writting functions and creating loops and solving various problems. This help you get use to solving problems with computer programs. Writing some HTML and Javascript may be a good start or use Python. Once you get use to programming and using that Mindset a college education will help hone your skills get you off some bad habits, teach you some fundamentals you may have missed. But this way when you take classes in different languages and technologies you have some solid fundamentals and you will not be struggling with basic problems when the teacher is trying to show you a more complex process.
If something is so important that you feel the need to post it on the internet... It probably isn't that important.
The best way?
Hmm.
I would start with C. Seriously. Then, choose a project. Then, just start! Hammer your way through it. It'll suck at first and progress will be slow. Then each little thing you learn will take you closer and closer.
Why C? Most things are written in it and there are plenty of "sample" programs to choose from to view code.
-- I am. Therefore, I think!
Your suggestion that one should learn several types of languages is a valuable one.
I do have one nitpick: C is not a functional language. C is an imperative language. LISP is a functional language. Scheme is a functional language. Haskell is a functional language.
Here is what the Wikipedia has to say about functional programming
No, it's like telling an architect the characteristics of bricks, steel, ceramic, cement and other building materials.
Without assembly (and a class in hardware design) you'll never understand the gap between program syntax and execution. So you'll never understand how programming works, never understand the need for optimization or why some things are possible and others are not.
In the end it all comes down to data. Languages come and go. Code comes and goes. But it is quite common to find data which has survived essentially intact in structure and content for 20, 30, even 40 years.
So don't start with any language. Start with building a deep understanding of data: what it is, how it is modeled, the techniques used to manage it. Since most data today is stored in relational databases, next proceed to understand how RDBMSs work in theory and in practice, and how to write good performant SQL. If at the end of the day you understand why "multiplatform code" is a bad idea, You Will Have Learned(tm).
Now my question for the language mavens: most people of my generation learned procedural languages, and never really "got" the whole object-oriented thing. Most people of the 1990s and later generations seem to have started with object-oriented, but they in turn don't "get" pure the pure procedural approach (and for sure very few of either camp understand SQL). Is there any good learning language that would help a newbie put a foot in both worlds?
sPh
I say "mock interviews" because these firms don't want to hire you at all: they want to hire a foreign student that they've already chosen. But before they can do that they are required to first interview a set number of native U.S. citizens and reject them as unsuitable for the job. Once they have interviewed a quota of "unsuitable" U.S. citizens they can then accept the H1-B applicant that they wanted to hire all along.
And then all those things you mention become trivial :). And I'm not joking.
As the island of our knowledge grows, so does the shore of our ignorance.
The gp poster may have gone too far into the theoretical side, but his point is not without merit. You can "learn" how to program java, or ajax, or whatever, but without a foundation, all you're doing is memorizing a set of algorithms specific to that application.
I'm a firm believer in an IT education. I think teaching someone "how computers work" and "how to program" is more important in the long run than "how to program ruby-on-rails". Learning the specific languages means you're immediately marketable - while getting an undergrad degree would mean 4 years + probably 2 of experience on the job - but, in a few years, your degree will still be worth something. If you know the fundamentals, you understand how programing works, you can learn new languages.
~W
sig?
What's massive on the scale of a University degree is a trivial side project on the scale of the industry. The OP might not have been very articulate saying it, but the problem with CS is that they do not teach you to work on existing codebase (95% of programming jobs out there) and you only work in small, mono-disciplinary team of people roughly of your skill level. That's not how it goes in the industry, where you have to work with many people, both incompetent and genius, on hacked-away codebase doing project that might last longer than you entire degree. To the defense of universities, there is not much they could do to prepare you for that.
:wq
you arrogant little youngin..
select * from blah is easy..
sql is far from easy.. trust me, and to save you from looking stupid in the future it can scale from extremeley easy to super hard.
There are enough amateur programmers making unboundedly shitacular software that, for the love of God, don't even start producing crap. We'll all be better off. We do not have a scarcity of talentless hacks nowadays. If you're serious about this, study software engineering at university. If you're not, then sod off.
Which might be absolutely true, but does not necessarily make you a good IT practitionner. The only guy we have at work who have a solid formal training in CS fundamental (B.Sc in Math, MS in CS) is a real genius indeed. Unfortunately, he does neither test nor comment his code, can't get his priorities straight and serisouly lack social skill. While his code is very elegant (if somewhat obscure), he does not get much more job done than mere MIS undergrads (and thus, not much more revenue). In the end, you need a skillset that match your job. And most IT job do not require discrete math, whatever you believe.
:wq
Discrete math is the foundation of computer science. I would actually argue that even it's the foundation of thought, but that's a different discussion. Anyone who wants to know about computer science absolutely needs to understand discrete math.
But the OP asked about IT, not CS. IT is a completely different field than CS, and one can get by perfectly fine in IT without knowing any discrete math.
Start with C, (prefereably on Linux rather thn Windows as the API's are more stable and standard) to get basic programming approaches understood.
Then go to C++, to get a grip on Object-oriented programming.
Only then move onto Java, then all the web-enabed stuff.
This approach will help you develop and build a good understanding of computers and allow you to find your own good programming aporach without the unnecessary extra confusion of HTML, XML etc at a too-early phase.
Read Charles Petzold's book "CODE - The Hidden Language of Computer Hardware and Software". It will give you a background in how computer languages and hardware were designed in a fairly approachable manner . After that grounding in the basics, you will be able to see that all the the languages and hardware are just different ways of solving the same problems, and switching between them will be much easier. Then if there is a specific technology you are interested in look it up in a search engine and/or Wikipedia to find out what that specific technology is all about.
explain to me how knowledge in assembly makes a Java-programmer more productive in a significant way?
Knowledge of assembly language makes asking for a raise easier, by claiming that one is being recruited by a firm that develops embedded systems software or 8-bit TV games.
But [assembly language] is _not_ the most energy efficient way to learn how to program in a modern environment.
Modern environment, or modern 32-bit environment?
This served me well by way of a basic programming education, and when I was involved in restructuring the IT courses for science students we refined it but largely retained the concepts.
You should start with a two-part theoretical introduction. One half of that should lead to some broad understanding of the fundamentals of computers and their programming. History of computing, Turing machines, basic computer and CPU architecture, basic principles of computer networks, a cursory overview of machine code and assembler, basic concepts of different types of programming (object-oriented, procedural, ...) languages and how they differ, relational vs. other databases, etc. The idea of this is to get the essential background and learn the jargon, so that if people throw new terminology at you, you can at least place it somewhere in the right context. The goal is not to get into any detail.
The other half of the introductory course should be rather more formal and very well understood before you start to do any programming. Crucial elements of are a good understanding of (boolean) logic and simple probability theory and statistics, a thorough introduction to data representation inside computers (data types, overflow and roundoff issues with data types, data conversion, arrays, pointers, linked lists, structures, etc., etc.) and a similarly strong introduction to control mechanisms (if-then structures, while loops, error handlers, etc, etc.) These are things that are important in almost any programming language, and a failure to deal with any of these correctly is a common source of bugs.
Once past the introductory course, you can lay aside the theory for a moment, and start programming -- seriously, not typing over simplistic examples from the textbook, but solving real if simple problems. You have to build up experience and the best way to do that is by slogging it out with a real problem.
It is best to pick a high-level programming language, and I advocate starting with an object-oriented one as it is easier to go from there to a procedural language than in the other direction. At this time I think Java might be the best choice; the essential tools for programming in Java are readily and freely available, and there is less risk of losing a student's time on obscure problems in Java than in say C++. These days C# also seems a reasonable option, but I have not yet studied it myself. And C++ might also be an option, but then at all cost avoid all Microsoftisms -- use g++ if you must.
Once you have some programming experience, it will be a good time to make a study of more advanced algorithms. (The disadvantage of using Java as a teaching language is that you will never be obliged to write your own quicksort.) The best way to understand these is to implement them, and you can't to that without some programming skills.
And when you feel that you have reasonable skills in one language, start learning another one. It doesn't matter which one, as long as it is different enough.
If you think JavaScript is basic, it's because you know nothing about it. JavaScript is a powerful OO language. Check the source code of a well written app, like FCKEditor.
If you want to develop for the Web I would say start with HTML and CSS as it's the primary language of browsers (it's not glamourus but to be really good you should know how to control it). As you get going check out Javascript, PHP/Perl/Ruby/Python/Java, an SQLish db, etc.
If you are going for more of a games or more immidiate interactivity bent, then you probably want to start with C, C++ or a higher level General Purpose language Like Python or VB.
As you work with one technology you can experiment with the others and see what fits. The important part is if you want to devlop a this into a career you need to do as much DOING (if not more) than LEARNING. Jump in! Make mistakes! Have fun! After a while you will get better and be able to make bigger mistakes... er.. I mean have more fantastic sucesses. (actually both are true; double, triple check your code.)
"Enjoy what you're doing! If it becomes drudgery, you're doing it wrong!" - Jim Butterfield
Like anything else, CS and IT is based on basic principles.
There are two aspect to IT: as a consumer of the technologies and as the creator of different layers of the technology.
For example, to some HTML may be enough to do what is needed to get accomplished and move on with their lives.
To others, just pluging in APIs into highly business oriented applications is enough.
However, there is a that other group of "IT" people who would like to know a bit more about what makes the whole information thing work. And those, I believe are the CS/Math/Engineering guys (when studied formally) or the hackers that play around with kernels and teach themselves how to hack (hack here doesn't mean script kiddies).
So, I think that in order for anyone to endeavour into "IT" one must choose a level to start and then move and down the chain of knowledge.
For example: start with HTML.
When creating HTML pages one encounters web servers. A curious person will learn how to set it up a whole web server to publish the created HTML pages. Once at this level, a curious person may want to try make the web server faster, or start playing with scripts (Perl, ASP, whatever). For some, this is enough. For others, finding out how HTTP works will do it (or move down all the layers in OSI model). Etc., etc.
Take the other way around (what I call: going up the chain). When creating HTML pages one encounters images (GIF, JPGs, etc.). Some may be curious and start creating their own images to embed in their HTML pages. Consequently, a more curious person may start playing around with graphics programs. Then such person may see moving images and movies and start playing around with Flash. Etc., etc.
So, in both cases one is always dealing with technology but at different levels. And all levels are OK. And if one has arrived at a full circle, then one is not looking hard enough, or there is not enough interest to keep looking. (Notice though, how HTML is is pivot to everything else).
Having said all this, if you have a formal education in Mathematics or Computer Science, you will notice that everything is based on first principals and everything comes down to the manipulation of data.
If there is no formal education, then pick something and be curious and start going up and down the chain. At some point you'll find out that you know more than what you think you know. And most importantly, anything you would have learnt along the way is of value to someone.
On a final note, you don't need to know everything about anything to be useful to someone or be interested in CS or IT (I like coding, but I don't do assembler coding--I know how to do it, well, I learnt how to do it but I rather not and that's OK with me.
Esta es una firma en Espanol.
Aye lad, thats the truth. Only on my CS projects, I did most of the work, got the A's, and figured out who I would be working with, for or not hiring at all. :) We have no slackers on our tech arch team, BTW...
Bruce
http://neufeldphoto.com/ <-- What I do when I'm NOT programming!
Today is a good day to code.
India.
There you have it. Now, I am going back to trying to master how to cannot-them. And remember, a carrot is more orange than an orange.
I rather like one person's comment, about an overview of the field, some modern languages... and assembler. When it gets down to the silicon, and you're hours into a debugging session, there are times that you *need* to understand some concepts down at that level.
Other basics - HTML and CSS, Java (for now), and a good procedural language. Maybe C, maybe Perl (there's *so* much difference in syntax ). But DON'T expect to spend your entire career doing Java, or Ajax, or Achiilles, or other Trojan War heros, or Emerald, Ruby, or any other shiny fad language. The real difference between most languages is trivial syntax.
As I say in interviews, anyone who doesn't expect to have to learn new languages and technologies, usually on the job, with no training, when you walk in the door (or your manager walks through their door), then you're in the *wrong* business.
mark
Honestly, the best place to start is with the basics: strong and deep Math background, strong understanding of how to code well and efficiently without necessarily using any particular language, how compilers work and best to use them for efficient compiling, how hardware and O/S work together, O/S kernels and drivers, etc..
Languages in of themselves you can learn rather easily if the foundation is strong. It's only details and specific changes from one to the other...
Like others have mentioned, you basically need two things:
1) A good foundation
2) A passion to do it
(Actually maybe #2 could get you by if it is strong enough.) Like other people have said, programming is NOT about syntax! Syntax changes, and will continue to change as new languages come out. The basics don't change.
And the passion to do it means you're interested enough in doing something on your own, for yourself, outside of class. I remember there were people who always got A's, but didn't really know that little extra to be a really good programmer because they only did what they had to do for school: never really cared about it otherwise. Everyone gets good at what they like to do.
"he drew his sword Ringil that glittered like ice... and he wounded Morgoth with seven wounds..."
Based on your question, you threw out things with a heavy web portion in there, so I will assume to some degree you want to learn things for the web, or at least, lean towards that to begin with.
The way I learned was starting with HTML. I learned the basics until I became moderately proficient. I later learned Javascript, which is a good started language to get you going with basic programming concepts. I next learned Perl, where I found Javascript and the Perl for Dummies book were a great way for me to learn. Nowadays I would recommend starting with PHP since it's a quicker language to pick up from Perl, though, not too different from Perl and C. The main advantage of a scripting language is that there is less to learn. This will give you time to get more proficient in general programming and help to establish the ground work if you wish to learn another language, and get into more low level coding like C/C++.
I then picked up XML, XSLT and SQL. When CSS was starting to emerge, I learned that as well. I did not get onto the Java bandwagon because all of the environments I worked in, except one, didn't use it. I would recommend though, to learn Java at some level, or even Python because they have a better Object Oriented Model than some other languages, without the extra work you will need to do like in C/C++. You may want to go straight to C or C++, it comes down to your background, aptitude and willingness to learn.
I can at least tell you I picked up HTML, Javascript and Perl within 1 year of playing with them. You won't be a maestro, but you will have the fundamentals.
I would also recommend getting some of the cookbooks out there, they offer a number of good points when programming. Also writing programs that mimic that which you want to do will help as well.
If you provide more information as to where you want to go, I'm sure others will be able to provide better guidance.
If you don't already have a strong passion and high level of knowledge for computers by the time you are ready to go to college, then IT probably isn't the place for you. IT salaries are inflated right now, and anyone entering into IT today without an already established high level of skills is going to be very disappointed when their job is later lost.
There is a tendency for people to look at salaries and then say "thats what I want to be". But like professional athletics, computers are not for everyone. If you you haven't spent your childhood exploring and learning about it for yourself, then you are coming in with a both hands tied behind your back and you're never going to catch up with people who have.
Thats not to say you can't find work...or improve your own skills. What I'm saying is that if its not your passion, don't push it. Find something you are really good at and focus on that instead. There will come a time when IT has a shake out, and if you don't speak computers like a second language, you are going to find your time spent trying to learn things to be a total waste. IT is becoming overcrowded, and the problems I see every day are created by people who just don't belong in that career.
Postings like this one, asking "where should I begin", just highlight the fact that you shouldn't begin. If you have to ask the question, you don't have the natural curiosity or the time to really pursue it. You don't ask where should I begin, you just begin and see where it leads you. We don't need more people who lack initiative. Teach yourself. Don't ask where to begin...figure it out. This isn't brain surgery, no one is going to die if you start at the wrong place. But seriously reconsider whether you need to start at all. If you have no passion for computers and IT, then you stand to get into a job that pays you too much and allows you to build up debt which you won't be able to afford when the shakeout finally does occur.
I'v coded for years with little need for extensive math or it's knowledge.
When the time did come, I would learn what I needed for that project, and that project only, therebye saving me time, agravation and sanity.
Why do soo many people act like you need to be Einstein to program?
NOTHING can be farther from the truth, unless you are going to create unusually extravagant projects like OS's, and full blown major apps like Word Processors, etc.
PLEASE stop scarring off potential great candidates with old-wives-tales.. PLEASE STOP IT!!
-- The InterNet is a terrible thing to waste, lets arrest Bill Gates and shut down Microsoft immediately.
I will gladly loose all of life's battles.. in order to win the war..
Cubicledrone, is this you posting under your other account?
I, for one, think that they should teach classes in high school on the dangers of entering the IT field. I wish I would have known these things years ago because there are many times those "sanitary engineers" seem to have great jobs!
I can't believe all the great posts that some folks put sooo much effort into here are not even getting modded, but the
-- Watch out /. here comes Digg :)
I will gladly loose all of life's battles.. in order to win the war..
The language you choose to learn is irrelevant. Like many fields of knowledge, the most important thing you can do is create a mental model of a computer that allows you to deduce more information.
So don't think in terms of a language. Pick a language to learn, but then try to understand what that language is actually doing. If you break down the standard C "Hello World" program, for example, you'll have tons to digest. When I define a string, what does the compiler do with it? How does it get passed to the printf funciton? What is a pointer? How does the compiler take my text and turn that into executable code? If you pick another language, you'll still have many of the same quesitons. The language is irrelevant.
So pick a task that you are passionate about. Pick a language that sounds interesting to you. And then start trying to solve the problem. And when you find that your mental model is insufficient, extend the model so it maps to your new knowledge. When you decide to learn a new language later on, odds are that 80% of your model will still apply.
I've seen a lot of people who learn C, and then move to another language and can't figure out why they don't need to end lines with semicolons. Or they don't understand how Java can do without pointers when they always needed them in C for structure arguments. The problem is not that they are stupid, it is that they don't really understand what is actually happening in the system as they code. Think about this from day one, and you'll have a much easier time of it.
And I'm not suggesting that you understand every nuance of the system. Odds are you be worrying about caching characteristics or interrupt timing for your first 50 or so projects. Many professional developers are clueless about the real hard-core system details. But the succesful ones all have a sufficient mental model for the level of work they do. And that's how they can adapt to changes in technology, languages and all things programming related.
http://www.catb.org/~esr/writings/taoup/html/Also The Art of UNIX Programming this is an in depth programmers view of the UNIX operating system and related programming languages/utilities. If you don't like his style (He's a little to Guru for some)he also mentions other books/works that can give you help on related topics.
I kept waiting for you to say you were just kidding..
Just because every time you pick up the fon for tec support these daze and you get a rag hed, doesn't mean ALL tec is moving off shores.
By the way, I use that term 'rag head' lovingly ;).
Furthermore, those Indians are MUCH better at being nice & knowledgable than the former USA reps!!
AHHHND, whooo wants those jobs anyway?? You? NOT me!
And PLEASE do tell us, since when is a potential programmers presence in the United States, stoping them from writing the next 'Killer App'?!
Not to mention, the miriad of work that needs to be done in OSS for the obviouse eventual down fall of M$??
-- Firmely entrenched into 'Bad Karma'... now I can FINALLY speak my mind.
I will gladly loose all of life's battles.. in order to win the war..
It's very C like, highly interactive... Python.org --> Documentation --> tutorial will have you programming in minutes.
Python removes you fron having to deal with annoying header files, makefiles, declaring data types, etc. Newbees can always learn that later. Although syntax is similar to C, it is consistant, and very easy to migrate to C or C++.
J
Being a black female with a disability also helps. (seriously I mean. Make use of anything you've got, it is YOUR future on the line (*) )
LoL!! And if you are like me, the largest 'minority' of all...
Ta da.. a 'White Guy'!! You can just rely on:
Ta DA!!
1) Uncle 'Pell' (Grant) or..
2) You can get a job and pay your own way!!
* I'll expect my Noble Prize for the 'Duh' award anytime soon :)
-- Firmely entrenched in 'Bad Karma'... Now I can FINALLY speak my mind.
I will gladly loose all of life's battles.. in order to win the war..
Buhhht, reallly, NOONE can stop a man from working.
Even in ANY of the Engineering disciplines. :)
-- My favorite thing about OSS.. IS its militancy!!
I will gladly loose all of life's battles.. in order to win the war..
I know you're trolling, but I will answer the post, just to avoid that you mislead some readers.
I know there are languages that don't are/fit in that line. They are Fortran, ML, Haskell, Forth and Ocaml. And may be prolog, and cobol, but they are of little interest. I've heard very nice things of Ocaml, and I want to learn it in the future.
So yes, this is a limited view because it doesn't include these languages, and that's why I said "Almost every language" instead of "Every language". But it's not much limited, because those other languages are almost never used except for academic purpouses, and even now people are just getting some interest in Ruby. And the languages included are the most used programming languages, that comprise 99.99% of all code written.
Now you say: "Programming languages don't fall on a single axis between functional and procedural. That's ridiculous." I totally agree with that.
The part you got wrong is that Lisp is not a purely functional programming language. It's not been for about 40 years. It's just the first ever functional programming language. Lisp can do imperative, procedural, object oriented, aspect oriented, and who-knows-what-comes-next programming just fine.
On the other hand, Haskell IS a pure functional programming language, and ML and Ocaml are mostly functional programming languages and that's a reason for them to not to fit in that line. Forth, being stack based, is a whole different beast, it couldn't fit even if we try. I don't know Fortran, so I could not place it in the line.
However, there is a reason for that line.
It means: In this extreme (C) you're can do this: imperative structured programming.
Move a little (C++) and you can still do that, but you have this too: object oriented programming, generic programming.
Move a little (Java), and you can still do what you did (except template-metaprogramming and some other stuff), but you have this too: garbage collection, multiplatform runtime.
Move a little (Python), and you can still do what you did, but you have this too: dynamic typing, first order functions, closures, an interactive prompt.
Move a little (Ruby), and you can still do what you did, but you have this too: anonymous blocks / lambda functions, continuations, some automatic code generation, native big number support.
Move a little (Lisp), and you can still do what you did, but you have this too:
-CLOS: The most powerful object oriented system. In normal object oriented programming, you have single class method dispatching, in CLOS you have any number of classes method dispatching, pre and post methods, and several other stuff.
-Native Rational number support.
-Full functional programming.
-Lisp macros, the stuff that makes Lisp a programmable programming language and can make lisp adapt to any paradigm you want, like aspect oriented programming (which was in turn inspired by CLOS).
Lisp is even more multiparadigm than C++!
This line also lies in the axis of compiled vs interpreted. However due to heavy investment in that area most Lisps are compilers too, so there is a performance jump going from Ruby to Lisp, toghether with the expresiveness jump and the weird parenthesis syntax. Lisp needs the parenthesis syntax because of the macro system.
In fact, if there is a problem in the line I drew, it's in the jump from C++ to Java. Java can't do everything C++ can. In fact, java is a very limited programming language, compared with the ones around it. It just has an awesome IDE and a shitload of libraries.
If I had put Haskell in the other end of C, instead of Lisp, your post would had made sense. But it does not.
I guess you need to learn more about Lisp. It's been evolving for almost 50 years.
We are Turing O-Machines. The Oracle is out there.
Just learn the things you need on the fly, and only them. Don't try to understand everything before you even start.
I know it might sound a little strange but if you can develop mainframe skills in 5 years you will be worth your weight in gold..
It DOES sound a little strange :)
This person is suppose to hon skills that 'might' be valuable in '5 years'??
LoL.
But what is even more amazingly strange sounding, is you got an 'Insightful'+4 for a remark that is sooo.. 'ridiculous'.
--
I will gladly loose all of life's battles.. in order to win the war..
assembler? why not start out with maths and physics first? them move up to electronics and the such. and dont't forget the holy scriptures and valium in between for soul nourishment.
Lol, I thought the same thing. Assembler to 'start out with'.. so you'll 'learn'??
Assembler at college level is considered one of thee HARDEST courses!!
WHHHY would anyone want to be soo discouraged right off the bat!
The bottom line, and the FACT is, programming in general, is like math..
If you were born with a 'nack' for it, fine.. but if not.. well, you will be VERY miserable in it-- the rest of your life.
Again, I'm amazed at the posts that are getting recognized by /. management recently, as; 'Insightful'... when the poster was clearly trolling by acting like noone else has posted anything worth while today in this thread.
Then again, maybe /. is using the 'other' meaning for the other word: INCITEFUL.
--
I will gladly loose all of life's battles.. in order to win the war..
Ok, this takes the cake... someone who was/is in 'Psychology' & Criminal Justice, telling a new programmer how to go about it!!
I tried to find some good/correct/possitive things in this: 'Interesting' +3 modded post.. reallly, I did!!
lol.. but telling someone to 'work closely' with someone who already knows the 'stuff'??
Ahhhnd, goto your local library, for 'NEW' books!!
That part is not even vaguely amusing, let alone correct.
You will NOT find any newer books than at your local book store or online-- NOT in the library; they are rarely up2date, especially with the RepublicanTs in power.
-- Shheeeesh.. I beginning to feel like an old 'wash-woman', who should be paid by
I will gladly loose all of life's battles.. in order to win the war..
Neither is html.. they are scripting 'languages', or 'mark up' languages, but not 'programming' languages, by any stretch of the imagination.
Just thought I'd clarify that for the person who is asking for help.. since there is a word of difference with these concepts and areas of programming.
--
I will gladly loose all of life's battles.. in order to win the war..
You need to be a specialist AND a generalist.
Have a big bag of tricks to solve problems, but specialize in the problems you solve. You can have all the language skills on the planet, but if you don't have a specialized field in which you apply those skills, you will not have an edge against the armies of similar Jacks-Of-All-Trades out there whose resumes also read like a bowl of Alpha-Bits.
choosing a different career. Unless you want to move to (or already live in) a third-world country. The whole information services industry in the developed world has become viewed by management and finance as something like the cleaning service staff. Necessary, but entirely expendable and easily replaced. Not the kind of career a person with any potential would choose these days.
In my experience there's the end user, administrator, programmer (builder), and software engieers (designer). Each have their own overlapping niche. Learning to program, in general, does not require one to be overly familiar with discrete mathematics. My brother is 12. He can program in BASIC.
Often wrong but never in doubt.
I am Jack9.
Everyone knows me.
if you SEARCH around... there are a TORRENT of good sources. OREILLY'S generally produce good books. note.... Those three words are in caps for a reason....
I may be wrong but you're downright ugly!
Don't aim to be a programmer per se.
Pick a domain that you're interested in: finance, GIS, retail, transportation. Then find out what technologies are typically used in that domain. If you don't like those technologies think twice about the domain choice... Certain domains still use mainframe computers for example. While others focus mainly on destop GUI apps. Others mostly web-apps.
Then spend some time reading up on what companies, or OSS communities are involved in the technologies required for your chosen domain. Also, don't ignore Operating System trends. Some domains will generally be O/S agnostic, while others will tend to pick a certain O/S (like Windows). These will affect your platform choices.
Once you've figured that all out, pick a language to learn and have a 2 and 5 year plan to progress in it. Also plan to learn a new language and/or technology every 12-24 months in addition to your primary bread-winner technology. Get certified. Not because it actually means anything on paper, but because it motivates you get better. Go to symposiums/seminars in your chosen technology to meet people who are actually using it.
While you are correct that it is necessary to learn the theory first, a stronger foundation is required for proficiency in IT. The best idea is learning category theory first (Barr & Wells) and then once they have progressed to the notion of a cartesian closed category, they learn the lambda calculus and begin writing programs (on paper). After that, studying Moggi's work on computational monads should give the neophyte adaquate preparation to understand state. It is at this point that the shift to Haskell should be made. Automata should be studied along the way, but more emphasis should be placed on what is really going on: studying subsets of a free monoid! Needless to say, combinatorics, graph theory, mathematical logic and group theory should also be studied. Once Haskell has been learned, I recommend studying TAOCP as this teaches assembly + data structures + algorithms.
I can't tell you how many times I've bumped into people who thought they really knew their IT but when it came down to it they knew nothing. Truly pitiful. You wouldn't believe how many people out there give me a funny look when I tell them Russell's paradox is actually a special case of Cantor's diagonal argument.
The above may seem too theoretical to some but it has immense practical capability. For example, say you needed to program a blender and wanted to use fuzzy logic. Well, I can't tell you how much it helps knowing that fuzzy set theory does not exist in a topos, but it does exist in a quasitopos. Right there you have a ton of peer-reviewed knowledge to build off of!
You can thank me later.
Okay, okay, so SQL practically reads like english... that's all great... however, there's this whole thing called "The Five Normal Forms" that many people who dive into SQL never learn. I find that many people who jump in and learn Perl, PHP, and some SQL can create these fabulous messes of a system. That's usually when I get hired to clean the mess up when the company realizes it can't double its growth again until somebody fixes their "database" that some scripters piled up with a muck rake.
Do yourself a favor. Don't just be another script kiddie with a muck rake. Really learn the technologies you're working with well. Get a depth of knowledge. Learn not just how to do a thing learn why you do it. Don't just think of how to solve a problem... think of how best to solve a problem. If you aren't experienced enough to know a few different techniques, that's okay, just think about alternate ways you could do the same thing. As you build this catalog of alternate techniques you could begin to see when one way would have saved work and another made more work than necessary.
A good theoretical underpinning will serve you well. It will give you the right "why" questions to ask but it won't give you the answers. If you can't get a college degree right now or are too busy for one then try and think ahead about the life of your project. Think about how it will evolve and grow. Think about what you'll need to know when you hit those road blocks. The key is thinking ahead and reflection on what you've done. Think how you could make it better.
Whatever you do in the long run don't short change yourself! Get your magical piece of paper that says you have a four year college degree. It really is the most valuable investment you'll ever make. Unless your current project has a name like Microsoft or Linux you'll eventually want that degree.
Figure out what you want to do, what you can realistically do, and what you can get paid to do. Start pulling apart what the needs are, why they are what they are, and how they will evolve. Then you begin to apply yourself to these domains. If that's too hard start scanning the tech sites and figure out where the most jobs are and buy a "teach yourself in X days" book and go to it cowboy. Once you wrangle that job start in on what the company you work for really needs, why they need it, what they can pay for, and how their needs will evolve then get to work inventing the future.
That's what the difference between a job in IT is and what a career in IT is. A job in IT is just setting up a spam filter... a career is making the spam filter better... or inventing a new spam filter. The difference between a job in IT and a career in IT is the difference between dealing with the future and inventing it.
[signature]
Oh, puh-leeze.
They might not be compiled languages, but they sure as hell ARE programming languages.
Go back to whatever institution you graduated from and ask for your money back.
Mod parent to Troll, please.
The reality for most people working in software development is using a C (C, C++, Java C# etc) based language talking to a relational database, so if I were you I'd do the following
1. Learn how to do simple projects in a C based language, including how to create make/build files, use the compiler properly etc without the use of a graphical ide.
2. Learn how a relational database works, I don't mean how to administer it, I mean DDL, DML, SQL, etc and a bit of relational theory.
3. Put the first two bits of knowledge together to create more complex projects (this is probably what you will spend most of your coding life doing).
4. Learn to program. This is very different from learning a language and is all about how and when to use data structures, control structures, patterns etc. N.B. This step will take most of your career to accomplish to a high level.
I'm sure this comment will get flamed by people doing work with LISP, Ruby, Perl etc, but in my 12 years of experience most of the real world work is done using the stuff above.
As to learning app servers, HTML, JavaScript etc, feel free to learn those as well, they're easy to learn and so give you a few quick wins in what is going to be a reasonably taxing task, but don't think these are what programming are about. The interesting stuff is at the backend.
Other than that, enjoy it, coding is creative and fun!
Dum spiro spero
There are several books that every programmer- student or professional should have in their library. Master them and you will know the inner way of geekdom!
The Art of Computer Programming- Knuth, Donald. This is an ongoing multi-volume set by one of the legends in the field. The first three books are Fundamental Algorithms, Seminumerical Algorithms and Sorting and Searching. Dr. Knuth is working on more of these books but I can only vouch for the first three.
The C Programming Langauge- Kerninghan & Ritchie. C has become almost a ubiquitous programming langauge covering all sorts of applications from hard core systems components to user applications. Who better to learn it from than its designers? (I suggest the 2nd edition.) Even if you plan on programming in C++, a strong familiarity with C is very useful. Where do you think all those nifty library routines in C++ come from?
The UNIX Programming Environment- Kernighan & Pike. UNIX and its derivitives account for sizable percentage of the worlds servers. Knowing how to develop software in and for the UNIX environment goes a very long way towards successful employment. This book is a bit dated but its is a good start in learning about development environments.
The Design of the UNIX Operating System- Bach, Maurice. This book is often used as a textbook for undergraduate and graduate level courses in operating systems. It shows you how UNIX works from an under-the-hood viewpoint that many Operating Systems hide like Granny's bloomers.
Numerical Recipes..- Vetterling & Press. There are several versions of this book covering computational numerical methods in FORTRAN, C and C++. Most courses teach the C and C++ versions of this book but the FORTRAN version can come in handy if you have to deal with legecy FORTRAN code.
Introduction to Algorithms (2nd edition)- Cormen, Leiserson, Rivest & Stein. I have been in the business of programming for over 20 years. I still have all my hair and most of my wits because of Knuth's Art of Programming series and this book.
O'Reilly Books- Over the years I've watched this publisher rise from a small geek-press to a publishing powerhouse. Their books maintain a rigorious level of excellence and cover a diverse number of topics. If you must deal with any given software, compiler, operating system or database; chances are that O'Reilly has several indespensable books about it. In fact their book on Sendmail has become the defacto documentation for that vital utility. Bookmark these guys.
I have not covered the topics of Objected-Oriented Programming, Analysis and Design, C++ or JAVA. These are important topics which deserve much more attention than I could give them here. Nicholas Wirth is also an author who deserves a look- Literate Programming is a worthy book.
You may have noticed that the list is UNIX/C oriented because IMHO that is Computer Science. All other OSs are disposable or redundant.
Oh yeah- you don't have to spend a $1000 bucks and get them all new. Check out E-bay, Half.com or Amazon's used books sections for very deep discounts. Just be clear on the edition that you are buying.
With some talent and hard work, this list will take you far.
Best of luck,
OB
Is that a SCSI connector or are you just glad to see me?
I find it interesting that there has been very little mention of hardware. Isn't the T in IT Technology? Doesn't that mean harware? Just curious what good is software without it? Being able to drive a car doesn't make someone a mechanic. I dunno? Maybe its just me. My original computers were so crude and parts so dear I had to understand the "system" in order to have one. So that knowledge just struck me as vital. I needed a computer before I could even think about programming it. I'll say this understanding mechanically what is happening inside that box helps me.
try ruby on rails which is a good start without knowing anything.
I started working with Perl. I tried learning C at the same time and found myself bouncing back and forth quite a bit.
Try taking a look at a bunch of languages and choose what appeals to you. Learn that one, but don't stop looking at the othe languages. You need to find where you feel comfortable - there is no hardfast rule for learning; your brain is your own.
Just remember not to get to absorbed in one language. Once you start learning it, try to relate what is similar between the different languages and when you feel comfortable don't forget to challenge yourself in ASM (assembly). You should probably take a look at C when you're doing this.
C is where it's at. I'm not saying to start here, but you will need to learn this to become an effective coder. I personally feel you will not become an effective developer without it. (coder != developer)
Most importantly; have fun, embrace frustration, and don't forget the basics (data structures, search, sort, etc...).
Cheers!
Mike
Because Pure Math is one of those disciplines closest to the inner workings of the mind. It really does teach you to think clearly, to analyse, deduce, synthesize, create knowledge, research, explore, and be critical. It teaches understanding not just a body of knowledge. And math is also a language. Quite expressive language at it too. It's the language spoken by the universe.
Depending on how deep you go into it, and how long you exercise your mind, other things like computer languages (which at its formal abstract level is a pure math discipline really, grammars, syntax etc) become mundanely trivial. Now using a language to solve a concrete problem may be a lot more interesting, but such problems rarely arise in business and commerce.
As the island of our knowledge grows, so does the shore of our ignorance.
To start an education, go to school.
To learn about 'IT', go to school.
If the above seems to time consuming, focus on some aspect of 'IT', and go buy a book on 'begining how to...'
But what is it that you want to do with this knowledge, once you have it?
You missed the point. It is not a *requirement* per se, but as some previous poster claims, it helps, say, for an engineer to be familiar with the strength, abilities, and limitations of the building materials, and to have an understanding of the respective processes that bring them to be, in order to more effectively design structures which will use such materials.
Notice that *nobody* has suggested so far that the original poster _must_ learn Assembly in order to do programming, but that understanding the lower levels of abstraction will help him creating more effective code.
-dZ.
Carol vs. Ghost
I second this. "Start with an idea you have for something that you have a passion for". I'm 10+ years into software, know a lot of languages and have endured many a fad and religious debate. If you have a passion for something, trust it, begin there and keep it alive.
My passion back in mid 90's was C/C++ and Windows API programming and I wound up working for McAfee. Now, my passion is Perl because it lets me focus on the problems I am interested in. Different platform, different application, different tool. I am also getting into Java lightweight frameworks, not because it's a marketable skill or because it's a great technology, but because it is close enough to the ideal technology for a specific application.
Where to begin? How about Javascript? All you need is a text editor and a browser. Javascript is useful, object-oriented technology. I agree with an earlier remark that starting with command-line is helpful for a couple fo reasons. First, it forces you to focus on the essentials and second, it serves as an example of a working program with no bells and whistles.
As soon as you get interested in knowing how something works or fixing a bug, you will want to know how to "divide and conquer". Command-line programs can be tremendous time-savers, yours and your customers/users/employers.
I also think you have to be very practical if you want to pursue your passion. I loved the book 'Code Complete' because it helped me quickly benefit from other people's vast experiences.
Read stuff that interests you. Write stuff that interests you and try to keep an open mind.
What you need to do first is realize that all languages are pretty much the same. There are basic concepts that all modern languages will share. It doesn't really matter what language you pick, although I recommend C++ just because it is more "hands on" than other languages. Java and Visual Basic feel too "light."
Once you have picked the language here are the concepts you need to learn in order:
1) Basic input and output
2) Variables
3) Pointers - I chose to put it here because it isn't really that hard a concept and it goes very well with Variables. However, in most books you will see it listed later in the chapters, as an advanced topic.
3) If/Then statements, and Switch/Case
4) Loops - There are all several kinds of loops.
5) File access - this is opening and closing an external file for reading and writing.
6) Arrays - Some would probably argue that you need to know this before file access, as you will most likely be reading the content of that file into an array. I chose to put it here because you can learn file access without an Array. It is more important to learn how to open, close, read and write a file and to realize that you can do multiple things with that data, instead of being locked into reading it into an array.
7) Functions
8) Classes
Once you have learned all 8 of those, you are well on your way. You can pick up most other languages and be able to get a handle on them pretty quickly, because you now understand the techniques. Take extra time on classes. I found it the hardest one to learn. The concept isn't bad, but the various steps you have to take to write your own class can take a while to get down pat. Also, start experimenting.
From there I recommend two other concepts:
1) Database connections - This is how you open a database table from within your application and read and write to it. This is very handy knowledge as almost every program in the business world is going to read/write from a table.
2) GUI - anyone can make a calculator like program in a console window, using text. What people are looking for is someone who can give them a nice GUI with buttons to click on and maybe some nice animations.
It doesn't matter which order you learn the last two. Last piece of advice is terminology. I run into people all the time who use method and functions interchangebly. Furthermore, they swear their usage is the only correct one. It is easy to become confused when one book calls it this and another book calls it that. Just learn the concept and you will always be able to figure it out, regardless of what someone calls it. A few pointed questions and you will realize that your supervisor just described a function, even though he calls it a method. Or the new boss keeps calling it a header file when he meant a definition file.
While I do not disagree with your point of view I believe you miss the poitn. The original question is how to best approach an IT learning regimine. I am a pragmatist and believe that suggesting one learn higher order concepts is self defeating, as one would invariably be that much farther from practice for every conceiveable topic that might help them be a better tech. Howabout ethics, howabout contract law, howabout fridgerator maintenance and repair for those occasions when hardware is overheating? Coupled with the realistic assessment of the average intellect, let everyone start with such abstractions as servers, file descriptors, networking protocols, and then HTML. having taken a class in Discrete Mathematics may help them produce higher quality code, but I rather a coworker have actually USED Assembly to produce an optimized demo in the past. Discrete is a byproduct of experience. As most programmers find, the most valued resource is not someone's intelligence, but how efficiently they use their time.
Often wrong but never in doubt.
I am Jack9.
Everyone knows me.
...saying that one should 'learn' C++...or C...or Java...or whatever, is still a matter of degree. What level of expertise are we talking here? Idiomatic C++ or PERL is a big undertaking whereas going for casual familiatrity is maybe not so bad. And without knowing what one job is going to tackle, who's to say which study would be useful in the measure of time spent vs actual gain? I'd say to maybe pick an arena first before choosing the tools: desktop environment, system apps or web environment? At least then, you know which bag of tricks is likely to be most applicable.
You are trying to confuse my points.
I'm sure everyone else including the person seeking advice understands the difference between 'formating' a web page (which is all that HTML and PHP do, in their purest sense), and writing a program that can actually 'run' and 'do something'.
Just because something has a name or cliche attatched to it, as many scriping and 'Interpreted' languages do, does not make it so.
The issue here is to explain to the person entering this field, the various nuances that he/she may face in making a decision.
It is NOT to argue over issues that can easily be misconstrued, as you tried to do.
If the person we are helping is interested enough, they will investigate further to see what points are being made by any poster.
I did not say nor mean to imply that there were no relationships between 'scripting' and actual programming.
Scripting afterall is nothing more than taking commands that you would normally type on a command line, or 'editor', as opposed to learning an actual, bonifide 'Programming Language', which adheres to strict standards and protocals, which PHP DOES NOT.
HTML even has it's definition in its name, ie: 'Mark Up Language'.
Scripting, and Programming, ARE LITERALLY two different things, as I will point out in the references listed below.
Please see the following WiKi remarks on this point, under the heading titled: CRITICISM.
http://en.wikipedia.org/wiki/PHP
And here:
http://home.pacbell.net/ouster/scripting.html
For a detailed explaination of the differences in these two computer TYPE language systems.
G'day.
-- Solidly entrenched in 'Bad Karma'.. now I can finally speak my mind... 10 times per day-- the new 'limit' set by the same
I will gladly loose all of life's battles.. in order to win the war..
My advice is to learn Java first, which is what I did for 4 years. I am actually a little unique, I spent 7 years before that using VB3-6 so I'm Microsoft at heart, oh wait... I can hear the boos and roars :)
If you learn Java, you will be able to pickup C# (ASP.NET to run on IIS 5/6 or Windows Forms, even Windows Mobile Forms for Pocket PC 2002/2003) within 6-12 months like I did, and you'll be a double threat.
The Rules are;
- Banks love Java.
- Mid-size organizations ($1-5 million in sales or inventories) love Microsoft.
- You'll score big points with both skillsets.
MySQL database server has caught up to even the big guys DB2, Oracle, MS SQL Server in recent years and its a stable, excellent, fast enterprise solution now-a-day. The Query Browser is a nice tool to manage data, run updates and selects, export capabilities to HTML/Excel... as well, MySQL Administrator (as well as MySQL Query Browser) can be accessed over TCP/IP, I can work from remotely on any clients server, as well you can create C# distributed applications that also work great over TCP/IP with a Static IP address.
Best of luck, its a long frusterating road to success. Never quit.
Find Stuff, Everywhere. http://www.boomtrek.com/
Interesting that your first link describes PHP as a 'programming language', and the second one doesn't mention PHP at all.
PHP may be interpreted, but you can write complete programs in it which have nothing to do with HTML, and run them on the command line.
PHP is a programming language at least as much as BASIC is. This isn't about "who's right" and "who's wrong," but you might want to learn something about PHP before spouting off again.
The perfect solution to all our ills.
Well, that's ONE place to start- the processor isn't half as important as the basic concepts of what computers REALLY do behind the scenes.
SJW: a person who perceives an injustice, and while correcting it, commits a greater injustice.
What has happened is that the world of CS has become far removed from the world of software engineering. When I see a kid studying MIS to become a software engineer these days, I just shrug my shoulders. While you need a lot of math if you want to be a computer scientist, you're right in saying that you don't need much math to be a software engineer. I think math can sharpen your mind, but I've found that to be somewhat of a negative for the modern workforce.
What do you mean my sig is repetitive? What do you mean my sig is repetitive? What do you mean....
http://en.wikipedia.org/wiki/Discrete_mathematics
I studied all those topics in the best university in Latinamerica.
I have been gainfully employed for 15 years, working in many countries in 3 different continents.
The solid theorethical foundations I acquired give me an understanding that people trying to learn AJAX out of context will never achieve.
IANAL but write like a drunk one.
I studied the following topics at least on semester for an Engineering degree in UNAM:
-Ethics (yes, a full semester of it).
-Busniness Administration, Economics, Fundamentals of Mexican Law (which has to do with your point about conracts).
-Administration of Computere Datcentres (where amongst other things you learn to calculate if your equipment will overheat or not).
-Computer Networks (where we disected computer protocols).
-Operating Systems (where we learned about file descriptors).
-Digital Design (for the bit about assembly).
SO while sombebody learning AJAX only may learn something and even earn a few bucks, the point has to be made that a solid education will take you much further.
IANAL but write like a drunk one.
Start with C.
Don't. I didn't really grok good programming practise until I'd tried Modula-2 (and already been through BASIC, FORTH and a bit of C). OK, Modula-2 is an anachronism now but there must be a modern equivalent.
Learn a high-level language first. This will allow you to concentrate on the important concepts rather than fighting with the minutae of low-level programming. Ruby looks good, but I've only spent 2-3 hours on it. Lisp is good, but I've only spent 10-20 hours on it so can't give an informed opinion.
Learn the abstract concepts. A high level language with be less frustrating initially. Don't try something like C (or, heaven forbid, an nightmare like PERL or C++) because your confidence might be severely damaged never to return. C, because it's too fiddly for a beginner, PERL because it's the work of a deranged madman, and C++ because it's too big to learn properly and no one can agree on how to use it.
Start simple and general and work your way up.
My personal experience has been fully self taught starting with BASIC when I was 12, C/C++ Turbo at 14 and then 5 years in the game industry and doing freelance development from 19 to present (25) and learning many langs/techs along the way (Lingo, ActionScript, VisBasic, assembly, Win32 API, DirectX, OpenGL, MaxScript, HTML, XML, CSS, ASP, javascript, Macromedia Object Architecture, SOAP, J2ME, BREW, SQL (Oracle and mySQL mainly), PHP, you get the idea). With all those, I felt I was spinning in dependancies as well, but I just kept pushing farther with every lap and it turns out what looks like a circle at the start is actually the base of a spring. Just keep going, google up code samples, surf forums, it'll all make sense eventually with patience and commitment.
DONT PANIC
D: i found that useless ... it's like learning the theory of fishing instead of doing it. If you think in a logical manner you can jump right into an easier language if you find a good tutorial, i really doubt the utility of learning the theory behind programming. It is a computer, it obeys your every comand perfectly, just don't screw up.