Web Programming Is Hard
shubharamani.com
shubharamani.com
In my more sensible moments, I remember that that idiot only needed to know HTML, CSS, the DOM model, Javascript, jQuery, HTTP (mostly headers and status codes), Ruby, Rails, basic MVC design, Oauth, SQL, SQL performance, five-ish APIs to support the two that needed integration, how to configure and maintain a server, system architecture, a bit of security, etc.
[There's also object oriented programming, class inheritance, polymorphism, algorithms, time complexity, discrete math, data structures, imperative programming, and a few other things I forgot the first time around. Lest we forget, we might take these for granted because we've been programming since we were $ARBITRARILY_YOUNG, but to most people these are just black magic. My girlfriend, a smart cookie, asked to see "how I made the phone ring" and, after I showed her the code that did that, told me it had never even occurred to her that every program she's ever seen was once a collection of special words placed in a particular order.]
After that, it was pretty much done, except for the marketing.
On the plus side: you can learn one or a few of these things at a time, and get more comfortable with how deep the rabbit hole goes as you go along. I coded my website in static HTML written in Notepad with no JS or CSS, crikey, only four years ago. (And my brain still recoils at how much better I'd have to get to do e.g. web scale work.)
What I wonder is: Does the following sentence run through the head of every expert in every field?
Man, I really shouldn't be getting paid for this. Any idiot could [do X].
It certainly felt true of most of my day-to-day work in graduate semiconductor electronics. It felt true of a lot of biology research. My conclusion is that there are a mere handful of days in your career when you will have to do something so hard that you will feel smart about it. But most of your career as an expert will be spent doing stuff that you know so well that it's kind of routine, even if it is totally esoteric stuff that only you know how to do.
Feynman said it well when he teased the mathematicians: "Mathematicians can only prove trivial theorems, because any theorem, once proved, is immediately seen to be trivial."
OMG. That is such a perfect analogy. I've had that same though, but not in those words. I'm probably going to steal that.
Actually, it's like maintaining a skyscraper built from steel, concrete and glass integrated with complex HVAC, plumbing, electrical and elevator systems.
But this is only a few years after the web was invented, and the average website is still sufficiently ad hoc that the Tinker Toy level is a lot more visible.
---
[1] Break any human-designed system down far enough and you'll often arrive at something as simple as a Tinker Toy. Although, of course, Tinker Toys are not that simple, so this fact may not help as much as you'd think. And this is not true of all systems: In metallurgy, the "simple" parts are atoms, quantum mechanics is not like Tinker Toys, and even if it was nobody has experience with a Tinker Toy set containing 10^28 pieces.
Adding, "Designed by a committee. Of MC Escher fans."
It never works!
I think this is true in many fields.
It's usually a case of 'knowing where to tap'.. once you have that knowledge, the process of building stuff isn't always so difficult.
Another variation: what I do is not easy but every person practicing in my field can do this just as well as I can.
I worked very hard for many years to master my craft and always felt deficient along the way because the individual pieces seemed so daunting as I encountered and dealt with them. Not daunting in the sense of insurmountable. Just difficult. Long hours, Lots of sweating it out to get a given project done, one step at a time.
Nothing new here. Everyone who works hard to try to excel in his field goes through it.
It took me 10 years into my career to realize that many in my field (law) were not like me but contented themselves with cutting corners or otherwise coasting along while seeking to avoid the hard challenges.
Doing something right, and learning to do so consistently, is hard in any complex field. It does seem easy once you have mastered the difficulties but not that many are willing to do what it takes to get there. People are all too often content with mediocrity.
I remember going through that moment. It puts the quantity of "best practices" chatter into perspective. People say this stuff over and over because it seems so widely ignored.
I definitely think that periodically about technical translation. Any idiot could read some text and type the exact same text. Then I remember that not everybody can read German, French, Spanish, Italian, and Hungarian, and still stay focused on being able to write readable English.
This is the Dunning-Kruger effect, is it not?
One of the painful things about our time is that those who feel certainty are stupid, and those with any imagination and understanding are filled with doubt and indecision.
-Bertrand Russell
> Does the following sentence run through the head of every expert in every field?
> Man, I really shouldn't be getting paid for this. Any idiot could [do X].
That's because most experts are humble. That is what allowed them to become experts in the first place.I think experts are paid so much because of the other 10% of the time. When convoluted edge conditions have made a mockery of all things abstract and sensible, they are capable of diving into the black boxes and figuring out what's really going on to save the day.
Taking the idea to software, maybe it wouldn't hurt to hire cheap programmers as long as they're following the directions of an expert.
I concur, a sort of an apprenticeship program would be quite useful. If an expert can guide 1-3 people to do most menial tasks, it would serve the dual purpose of getting stuff done and educating a lot of interested people.
Currently we have university projects, internships and the like. However those are often slow to react to technology changes, or are too rigid and lacking proper employee orientation procedures.
It is a nice pipe dream to have a sort of a board where one could find a mentor in a particular subject, while working on a real-life project that shows all the dirty stuff that most undergrads are sheltered from before they enter the job market. E.g. topics of the "I'm doing a Django project and I could use some slaves to do this, this and that" sort.
If you hire cheap programmers to handle the 90% under the expert's supervision, the expert still has to painstakingly review the work so as to ensure it was done in a way that at least sort of resembles the method the expert himself would have used. And having reviewed other people's code, I am of the opinion that process is sometimes soul-crushing.
As a cheap programmer, I appreciate the consideration, as I like to feel I have some utility. But as an entrepreneur, I think it's a bad idea.
I realise this may come across as me being arrogant or unable to work in a team. I can't with good conscience pass judgement on the former; I am however frequently contracted as an extra brain and pair of hands on projects with people of comparable skill who could do it without me, save for the project's time constraint. This generally works very well.
It's conceivable that the model might work if the skill gap isn't so big. Presumably that makes the programmers less cheap, and the scheme less attractive. Plus, they could probably muddle through without me, thus never feeling the need to hire me in the first place. Which, I assume, is why this has never happened to me.
I've watched other home owners I know try to do things on the cheap and they're constantly getting burned. Things take longer, there are unforeseen problems and jobs quickly develop into hassles. If you can't afford to do it properly then just don't do it. And if you can't afford to hire the right person for the job then don't hire anyone.
That's what I've learned.
Also, with lots of embedded stuff, you don't get the "do over" of being able to update your server with the latest code. Once it has shipped, it had better work. In some cases, people's lives may directly depend on it, something that's probably fairly rare in the world of web programming.
I'd hire someone good with C pretty quickly, if I had the time to let them get ramped up, and they demonstrated the flexibility and willingness to learn.
Is there another equivalent when it comes to a somewhat popular technology where quirky fixes are actually the main part of the work process?
ducks
On a more serious note, the closest equivalent I can think of is porting games to work on windows, linux and mac platforms. You would have to have a good understanding of the entire renderer, any main event loops and physics, as well as experience in writing very low level code on all those platforms.
You should talk to my new boss, who just tore a strip off my ass for not getting somethings done in 3 days, that took another team in the company 3 months. Oh, you just have to "do this", no problem. Invoke Magic, upon 10 year old hardware.
I think in order to become more and more skilled you tend to abstract certain things out and take them as a given. Basically you know how things work, you just never think about them.
I remember when my company had an intern, and his only real education was college based (he hadn't really worked on any of his own projects). I had to explain how our stack worked, and generally these are a given when you're working with the stuff. But to someone who has never worked on this stuff it's very odd and unfamiliar. I also think that in order to build a good product for someone it helps to get to that point. I don't really need to spend a lot of time thinking about implementation these days and can focus on what would make clients happy.
To users, this stuff just works and I forget that sometimes because I'm in the weeds.
I've been bringing him up to speed on the web stuff, though, and he's said the main thing that gets him is that he can't just learn a language and build an app. He's got to learn HTML, CSS, JavaScript (the DOM, jQuery), SQL, PHP/Ruby/Python and any accompanying framework we choose to use, etc. and piece it all together.
It's not that he finds any one of them particularly difficult (he's picking up on them quickly), it's just that there are so many pieces to the puzzle that all need to be understood and fitted together (and they often inter-mingle so much that you can't always separate them out and do one, then the other). It's just a large and varied volume of things to process.
For example- there is a php project I want to contribute to with bug fixes. I can fix the bugs no problem, but submitting a patch & using the bug tracking system? Way beyond me!
Deployment is definetly ugly. There's stuff like pip, fabric, and virtual-env (all on python) which are meant to ease the pain ... but the fact that agile geeks reccomend 3 different frameworks just to make things simpler show how ugly it is. I don't know what the cool kids use for PhP though.
For instance, terrible UIs on the web are just as common as terrible UIs in GUI applications. And making a cross-platform GUI application that looks good on all platforms requires familiarity with tools specific to each platform, which is much more involved than learning browser quirks.
The hardest thing about the web is probably how fast it moves, but that's also what makes it exciting.
But the reason was simply that I had formed my opinion back in ~1998, when "web development" really did mean just HTML, and maybe some roll-over script, most of the time! Being a systems programmer, I simply never had occasion to update my perception, as "web development" dramatically evolved while I wasn't looking.
The main challenge of embedded is that you are in charge of controlling and managing everything. The developer is closer to the hardware and the cost of things breaking is far higher because you cannot for one second forget about some part of the technology stack that's below you. Everything is suspect, and nothing can be ignored.
On the web, you get used to your automatic garbage collection, your GUI toolkits, your nice browser sandbox with infinite memory that gets automagically replenished, your in-browser JavaScript debugger and all that jazz. You get to enjoy none of it in the embedded systems I've worked with.
Fixing embedded systems in the field is freaking hard, so the quality of code matters is in a completely different dimension from what's on the web today. Now, I am not talking about Linksys router or your iPhone. That's just a fraction of "embedded" devices. I am talking about things that don't have a TCP/IP stack (or any connection to the outside world), don't have a GUI, and are installed at the contractor rate of $1,000/hr and must exist in the field for 10-20 years. There are millions of these devices shipping every month, and they are all around us.
Are you telling me these systems are easier to design than a webpage that can be twiddled with at your whim a million times a day?
Don't downvote just yet! Just so you know where I am coming from:
I am a product manager for a 100K LOC embedded stack that runs in 128K of flash and 8K of RAM. It's all C code, no OS, no toolkits, no MMUs, no garbage collection and no dynamic memory allocation. These devices get 15 years on a single battery and go inside your house. I've also had good exposure (not an expert) to the online technologies the author mentions. Yes, things may be tough to learn (I don't actually believe they are), but the web is a lot more forgiving of mistakes too.
And as someone who made the switch from embedded to web,I find web much easier in 90% of the time.
Sure its hard to learn CSS, but I want to see you learn how to handle Linux's buffer-heads or program a custom dma chip.
You're right in that the main difference is control. In the embedded world the developer has total control over everything. And the specifications for the product are very well defined.
The problem with the web world is that the specs are terribly defined or ignored and you depend on APIs that constantly change. Not having to worry about memory management is great in the web world. But instead you get to worry about how your page will render in 5 different browsers that each have decided to only partially implement some standard. At least in the embedded world if a piece of HW doesn't conform to spec it's defective and gets replaced. And you know exactly what that spec is.
I don't know which is worse. Being forced to write everything yourself or depending on the sometimes mediocre code of others?
But to me, the biggest challenge with web is the unforgiving avalanche of emerging new technologies a practicing professional must keep abreast of, literally during every spare second of their life, if he or she is to remain employed !! This unrelenting blizzard of new algorithms, new languages, new frameworks, new design methodologies is just another typical day in the life of a highly competent and employable web engineer.
The resource-limited embedded problems at your company are "old school". I'm not saying they're easy, but do the tools and technologies needed to solve such problems change much through the years ?
- get familiar with HTML and css. That is, learn the basics, their purpose and how they interact.
- get familiar with some basic JavaScript and how you use it on the browser.
- learn one of the prominent web languages for the server-side. Python, Ruby, PHP, etc. I used to recommend PHP as a first language because compared to other languages, it was ubiquitous amongst hosting providers. Nowadays, I recommend against, especially if you already have some programming experience. Python and Ruby also have a decent offering and they have the added benefit of a community that generally promotes better programming practices than PHP.
Having an overview of the entire development process, you should now be able to pick one area where you'd like to expand. Being a programmer I suspect you might pick either server-side or browser scripting (JavaScript). Stick to one at first and learn it well. When I started the web I rarely did any front-end at all. I concentrated on the server-side and was aided by some CSS and JavaScript coders. Likewise, I often worked with JS programmers who didn't want to know anything beyond the realm of what they were doing. It's a symbiotic relationship. - It may be tempting to do everything vanilla at first, but quickly switch to using a framework, they're often packed with lots of best practices. They're like training wheels, you can always take them off later when you feel confident.
As you get comfortable with one field you can expand on others. After years playing in the server, I'm only now expanding my client side skills. Also, beyond technologies, other areas of interest that can expand your overall understanding and web expertise, are interface architecture, usability and various other optimizations. As you go, you'll stumble upon many.
Gopher protocol. DNS protocol. IRC protocol. HTTP protocol. HTTPS protocol. All fine.
This is especially prevalent in .NET land, where there are mechanisms for storing data in hidden forms and hiding the statelessness away from the user.
Running an automated tool against your web app isn't a bad idea, but it's no replacement for thinking about what you're doing.
The complexity of web development is not intrinsic to the problem, but an extrinsic reality imposed by widely differing implementations of a number of overengineered technologies.
It seems like you've decided you're not capable of teaching yourself through it.
Also, read _Purely Functional Data Structures_ by Chris Okasaki. Unlike (say) CLRS (http://mitpress.mit.edu/algorithms/), it's even a pretty short book.
http://ask.metafilter.com/158740/You-were-doing-it-wrong
Somewhere in there, about half way down, is
Was 30 before I realized that it's not cheating to study to learn something or to work hard at something to get better at it.
If so, just ask the interviewer to write in emacs, tell him you are uncomfortable with a whiteboard. If not, find a new career.
How would you reverse the order of charms on a bracelet? Any time a step isn't clear, break it down further.
And that really is the key to programming. Which makes pretty much anything solvable from scratch. Whether or not you'll come up with the most efficient solution (or at least one that runs reasonably fast) is another thing but at least you'll come up with something, or at a minimum a well defined little black box that you know you're going to have to fill based on the name you gave it.
I've been asked in interviews before, how to reverse a single-linked list, and impressed interviewers with my answer to this seemingly trivial problem; but I also remember when I first met the problem, in a newsgroup posting nearly two decades ago, and I had temporarily convinced myself it couldn't be done in constant space. But then I saw the problem as pushing and popping of stacks: view the old list as a stack to be popped, and the new list as a stack to be pushed, and thence the list shall be reversed.
But doing it elegantly - in constant space - is besides the point. Reversing a linked list is a problem which can be solved, even clumsily, without much thought. But demonstrating problem-solving in an interview situation, that is the point.
If it's unfair to expect someone to answer a question like that in an interview, then I'm not certain what is fair. In a world where people with literally no programming skills whatsoever regularly apply for programming jobs, I need to apply some filter to weed out the incompetent. Sad experience has told me that educational credentials and claims of past work experience are insufficient.
A) Pressure of an interview situation makes it hard to think straight?
B) Absence of familiar IDE, environment, REPL/compile-run cycle makes it hard to work or think effectively?
C) Something else?
I just don't see how it could be difficult for someone who understands loops and pointers (as I assume you certainly do.) I would have filed "reversing a linked list" under the Fizzbuzz category of things-that-anyone-who-has-ever-actually-programmed-can-do.
But the first time I read some blogger ragging on interviewees who didn't know how to reverse a linked list, I read the first sentence of the wikipedia article and realized it would be easy to do (albeit probably not elegantly): just loop over the list doing push/pop operations.
It's a pretty easy solution, and already runs in O(n) time, so I'm not sure why I doubt myself. It's probably that although I'm used to devising solutions for complex problems, I'm unused to problems that are formally defined.
I wonder if people who would freeze at a question about reversing a linked list could answer that and similar questions if they were turned into "word problems" somehow; e.g. evilduck in another comment compared it to reversing the order of charms on a bracelet. Although I can't think of any examples that doesn't sound terribly contrived.
I did not have a clue about objects, classes, pointers (Pass By Val vs Pass By Ref was like flipping a coin), never mind linked lists. But despite this, I managed to get a lot done. Of course since I've taken the time to educate myself I understand now, but my point is in some settings you can go quite far without ever engaging the fundamentals of computer science.
I know the OP said she does understand all that stuff but it's also possible she barely needs to use it.
Ha! You'd be surprised at how many "programmers" spend years just cutting and pasting code without really understanding any of it.
And then I actually thought about what it takes to reverse a linked list for a second.
And immediately realized I will never, ever hire someone who can't regurgitate or reason how to reverse a linked list "from scratch" within a few minutes.
It's a linked list, people.
However... 2) Probably every list of objects you throw around in whatever abstraction providing framework you're using.
I think with web development a lot of the situations where you would want a linked list are abstracted away. Personally I would be testing people on how they take some kind of design outline and map out how they would approach it. Something like dealing with bringing together multiple API's to would be high on the list, this is becoming a much bigger part of web development.
Given a list of things, implement drag-and-drop way to reorder things.
Not that I expect to be in a position to make hiring decisions, but if someone can't answer that intuitively with a few moments' thought I know they're probably a couple of years' experience from being able to keep up with me.
Scenario 1) ------------------------ You have 2 candidates 'A' and 'B' in a team. 'A' is actually better than 'B', writes better code, and has the ability to debug issues which 'B' really can't get a handle on. Both get a call to interview for a company in 2 weeks. 'A' has confidence in his/her abilities, so just goes through an algorithms/data structure book and writes 0 lines of code in the 2 weeks. 'B' on the other hand, buys couple of programming interview books, goes through common questions (like reversing a linked list) and actually practices coding these questions. On interview day, 'A' is posed a question to merge 2 sorted linked lists. 'A' hasn't worked with linked lists for some time now, takes some time to come up with an answer, and writes up a solution on board that has some syntax errors. The interviewer had other questions to ask, but has no time because 'A' took a lot of time to code this one. ('A' has a cold start, so to speak).'B' when posed with the same question solves it within 15 mins (what with all the practice) With that confidence, 'B' aces the rest of the interviews. 'A' is kind of disturbed, cannot believe linked lists can be so tough, and does OK in the rest of the interviews, but still doesn't exude the confidence of a person who knows his stuff.
No points for guessing who is hired.
Scenario 2) --------------------------- Instead of short interview times and questions about what everyone calls 'basic data structures', lets say both were given laptops during the interview and were given a program/requirement that neither had seen before and something that did require logical/analytical thinking to solve. Say, instead of 40 mins they were given 2-3 hours to complete the coding/debugging with access to a compiler and to language/API documentation. Who do you think would do better? (If it is not obvious, I back 'A' to do better)
I would really say scenario 2) is a better simulation of actual working conditions. Unfortunately, most interviews are like 1), maybe because 2) is more work for the interviewer. (logistics + framing a good enough problem)
Programming blogging has a strong culture of focusing on the newest, shiniest, and cleverest; the only negative blog posts tend to be "why X is wrong". No one blogs about their difficulties, weaknesses, doubts, or the huge amount of effort it takes to get really good at something. I think that's unfortunate, because it paints an inaccurate image of programming.
Despite being engineers/programmers, we have the same proclivities for superficiality and marketing as any other field.
About half the time, I feel humbled whenever I encounter some new technology.
The other half, I wonder why anyone bothered.
The trick is knowing which half is which.
http://stackoverflow.com/questions/72394/what-should-a-devel...
On the other hand I worry that these kinds of lists promote an impractical approach to mastering a field that is at odds with being a "Hacker".
Think of it as being like Waterfall Subject Mastery versus Lean Subject Mastery. In Waterfall Subject Mastery you try to anticipate what you need to know up front, learn a bunch of stuff, then try to apply it to a problem. There are two problems with this model: First, you really don't know what you need to know. Second, you won't really understand it as well in the abstract.
With Lean Subject Mastery OTOH, you pick a problem and crank on it until you run into a wall. Then do some learning until you can overcome the wall. At first the walls will be many and frequent. But over time your baseline of competency is increased and you actually become productive in the new technology.
What's great about the lean approach is that when it comes time to learn about a specific topic, you have a much better context for understanding it, and thus the effort to learn it is greatly reduced. And because you have an active project, you can put your learning into practice more quickly and thus retention is increased.
The secret, though, to making LSM really work well is to commit to learning a bit more than just what you need to get over the wall. This is the difference between truly learning and being an eternal cargo culter. Don't just start banging against the OAuth library; try to understand how OAuth works. Just do it in the context of a real-world problem.
Don't get me wrong. I'm not against education and learning for learning's sake, I'm just more for efficiency and getting stuff done.
Probably the best is to sort of skim over the stuff you're supposed to know at first and then refer to it when you're reminded of it in your everyday work. Like the breadth-first approach Steve Yegge advocates for math: http://steve-yegge.blogspot.com/2006/03/math-for-programmers...
The only problem I've found with this approach in practice is that skimming makes me antsy.
To build a legit website:
1. Mockup a pretty design in photoshop. Use color theory, design principles, UX theory, typography skills, etc. 2. Convert the design into HTML/CSS. Make it degrade gracefully, it should be cross-browser compatible, validate, be lightweight, meet accessibility standards. 3. Add unobstrusive javascript if you want, site should work without it. 4. Run YSlow, convert all images into sprites where possible, condense/minify your JS/CSS. 5. Do SEO tweaks and best practices. 6. Oh wait, does the site display well on iPads? build a mobile version and a tablet version.
...
We haven't even gotten past the front end. Learn good db design, code your middle tier. Choose or roll your own framework. TONS of work.
Once it works, go back and secure everything for the OWASP10 and other potential holes. Also make sure it will scale gracefully.
Maybe you should optimize your cacheing scheme? Maybe tweak your php config so it runs faster.
AGhghghsdhdshf%@!$^#$ it never ends!
I decided to do a switch from embedded to web development about a year and a half ago after being laid off. My paycheck is smaller but I now work on a whole new set of problems. After working about 10 years in embedded and everything around it, I felt that I needed a change. It was as if I was solving the same problems over and over. And don't get me started in the state of the tools. I remember thanking the heavens when we switched platforms to PowerPC and ELDK.
At first I did not know were to start in web development. But I did decide to concentrate on the back end quite early. At first I approached each technology separately, mostly because of my ignorance. For example, I saw that tomcat was very popular, so I decided to take a look into it. But I quickly realized that I needed a birds eye view of the whole web service stack and not its individual components. At least not yet.
I started to look into frameworks. After realizing that there are lots of those and that I learn about a new one almost every week, I had to narrow my search. I've been working and learning Groovy on Grails which is all based on the JVM since then. What sold it to me was the fact that Groovy is a language very similar to Python, which I know, and that Grails is a web framework that integrates all the necessary technologies to get a decent site up and running thanks in big part to the amount of plugins available for it.
Like grayhairmomma says, it's a humbling experience.
Any ideas on where to start to get my foot in the door in the embedded world? I was thinking newbie kernel bugs and eventually Linux drivers.
Do you want to work on a system that has an OS, utilities, filesystem, etc such as the ELDK[1]? Or a little more stripped down with only the OS such as FreeRTOS[2], uClinux[3], or uC/OS[4]? Or even lower and use no OS at all. Use instead a foreground-background system--basically a forever loop.
Another way of doing this is to select the hardware first according to what you would like to do. You must keep in mind that you will most likely not have access to all the debugging tools that you're used to. This translates into very expensive compilers and debuggers for the high end hardware. But these days it seems that there is something for every taste and wallet.
Two particular development kits that come to mind are Arduino boards [5] and TI's MSP430 development kits [6]. I find the wireless watch development kit [7] particular interesting. I haven't used either.
If you see something that you like, try to find the corresponding development kit that comes with a development board, cables, and software.
A good place to start is by checking DIY or hacker magazines such as Make[8].
I hope this gives you an idea.
[1] http://www.denx.de/wiki/DULG/ELDK [2] http://www.freertos.org/ [3] http://www.uclinux.org/ [4] http://micrium.com/page/home [5] http://www.arduino.cc/ [6] http://focus.ti.com/mcu/docs/mcuprodoverview.tsp?sectionId=9... [7] http://focus.ti.com/docs/toolsw/folders/print/ez430-chronos.... [8] http://makeprojects.com/
Currently, I use an AMTEL AVR 2560; however, I've heard good things about the TI ones.
I honestly don't know where I want to focus yet. I figured I'll continue to take some more classes to get some breadth on the subject. Once I have a better idea of what peaks my interest I'll jump into the depth for a more specialized approach when I can make a better educated decision.
Good call on Make. I've been meaning to check it out, but haven't gotten around to it.
Thank you for all the resource links. I really appreciate your response.
Cheers!
I'm thinking sensor networks. If you can, then I would recommend to try something using the MSP430 for example, given its low power requirements. Take the microcontrollers and pair them with different sensors (eg., IR, temperature, etc) and an RF module such as xbee [9] in order to create a mesh network [10]. You'll need to work on the protocol and management side too-- a linux box somewhere with a database but that should not be a problem for you. But I realize that is more of a team project given the amount of work.
I mention this because I see some activity in this field and lately I've seen several articles, mostly in The Economist, that talk extensively on how sensor networks and the system that manage them will encroach our daily life. So if you can't figth them, might as well join them.
[9] http://www.digi.com/products/wireless/point-multipoint/xbee-...
I'll take a look at the sensor networks. Thanks again.
how to get a foot into a entry level job? I am not a EE guy. doing a BSCS.
An embedded programmer is a catch-all adjective I think. One could be working on very low level programming of microcontrollers (e.g., PIC32, MSP430) and FPGAs [11].
On the other end of the spectrum, you can find embedded programmers working on embedded devices that hosts complete systems with OS, filesystems and utilities such as the ELDK (referred in previous posts). The duties for such programmers include creating device drivers for the specific devices that the product has. I have for example, modified an existing application developed originally for a system with no OS into a Linux application running on a PowerPC board. For example, some of my duties were to modify the original application's absolute FLASH memory references to a method compatible with what the Linux based system offers (hint: I used mmap).
I would guess that someone like yourself with limited exposure to electronics would be guided toward the latter type of jobs. From my limited experience in my local area I believe that this type of jobs offers the best balance. Latter on you can move deeply into low-level development once you have beefed-up your resume if you so desire.
The trick here is to be identified by a competent manager that can match your education and experience to his needs. And you`ll be surprised how little managers need to know, technically speaking, to get a product going which means that you need to sell yourself well.
Senior positions depend heavily into the nature of the company. I find that importance given to hierarchy between employees is proportional to the amount of bureaucracy present. This translates into defined roles, which will need to be created (i.e., company is growing) or the position becomes available (i.e., because of retirement or lay-off). So for example, if you want to become an architect where you actually design a product or part of it; it will be harder in a big company. Smaller companies suffer less from hierarchy and give more chances to hold important and challenging positions but the pay usually lags far behind the bigger companies.
The best ways to get a job depend largely on the type of jobs available which are dictated by the companies implanted there. Where I am, there were several small companies that needed someone that could wear lots of hats. That`s how I started back 10 years ago. I had to manage a small network, program an 8-bit HC11 microcontroller, design the PCB, select the electronic components, do some soldering, do some mechanical design, and train the client and fix the bugs once the product was out the door. This path has led me to be a generalist rather than a specialist.
But I talked no long ago to the guy that was my boss back then, and he said that these days is cheaper to contract out the small jobs to specialized shops which wasn't the case back then or at least he wasn't aware of competent companies that offered a reasonable cost. So things do change. Be prepared to turn on a dime.
I think that you should not have too many problems going the embedded way. But you'll need to help the hiring person to match your skills to their needs. They may just assume that they need an EE just because they're working very close to the hardware. I think that you have a bright future. One of the most competent embedded programmers that I've met did a BSCS.
I hope I did not go ramble too much and loose you in the middle. Just one more thing. Remember that your worst enemy is yourself. Don't let self-doubt and/or laziness to get in the way. Control those and you'll have a good future.
[11] http://en.wikipedia.org/wiki/Field-programmable_gate_array
http://jira.codehaus.org/browse/GRAILS-3364
The default in the Java world up to that point (and possibly still is) is to put a session ID in the URL. That's been frowned on and not default behaviour in the PHP world for... well since almost always. It's just asking for trouble (intentional or accidental). But the default for Grails was to have this on, because that's just how Java people think.
And the answers? Configure yet some other aspect of your system ("just change jetty's config"-type answers). Why not give more control to the framework instead of forcing people to have to learn/manage yet more systems and components. That particular issue is 'fixed' now, but there's so many moving parts that I wouldn't be surprised if it is broken again in some configurations (hasn't been for me though).
As much as I love Grails, Java as a base platform was not written with the web in mind, and makes basic stuff harder than it should be.
Thanks for the link.
Something along the lines of Cappuccino will help a lot. Then you're "only" left with the problems of UI/UX, scaling, security, A/B testing, big data and marketing.
We're still looking for X to do to front end web programming that Rails did for back end web programming.
I'm (slowly) trying to re-learn C/C++ after getting decent with Ruby and honestly it just hurts. Few things I do need speed or system access on this level. The verbosity is painful, and you need so much (ugly code) to do so little.
When you get deeper into the UX, things like A/B, optimizing load time, scaling the backend, etc, and that is where it becomes less tedious and the domain knowledge required is more respectable.
Web programming is popular because it drives the web. I don't necessarily find it an intuitive programming experience. This way of thinking is the biggest obstacle ahead of the likes of me (hackers for pleasure) for business success, i.e. primarily focusing on what's interesting from an engineering perspective. This approach is sure to fail in business because people always care about the end result. Technology is just a tool to get there.
I guess part of the problem is when you study computer science or engineering in university, you try to learn the best engineering approaches out there and improve on your engineering skills. Then you face real life where the result matters. I cannot really say CSS or javascript is the best technology out there, but they play a crucial part driving the web.
However, for Web Development, you'll need something called HTTP POST or GET and you want to improve it with AJAX (and make sure that it still works even without JavaScript). The user input become sensitive, and you have to take into account many other thing to secure your server.
Still, Web Programming is fund. Having a server that answer requests is funny, for me. The author found Web Programming is hard, because it underestimated it.
But you really should be grateful for that. If it were easy a large number of us would not be earning what we do because things that are easy tend to devalue quickly.
Remember when being able to write HTML would net you $80 / hour?
Ten or fifteen years from now, when web programming is 'easy' you just might long for the times when web programming was hard but you could basically name your price if you were competent at it.
Second, the lack of integration between the various technologies was surprising. I often knew what I wanted a particular page to do, and the solution was to learn a new technology, and then figure out how to shuffle data between the new technology and those technologies I was already using.
Integration problems also crop up in the form of mismatches between technologies. For example, I use bignum integers in my code; but ran into all sorts of interesting problems: Ruby/Sqlite work fine; but as soon as I uploaded the app to Heroku, I uncovered issues with how these integers were being stored in the PostgreSQL. And Javascript needs special routines if it is going to handle bignums. I haven't encountered this sort of mismatch on the desktop.
That said, now that I've got a working app, I think the learning curve was in some ways (though not all ways) less steep than the desktop. A couple of reasons for this, I think:
1) The communities share code prolifically. It is not that there is no code sharing going on in desktop development, but code sharing seems much more prevalent in web development. As a new web developer, this makes my job a lot easier not only because I can just plug in code, but also because I can read that code and learn from it.
2) You can get minimal results quite quickly, which is very encouraging. Again, you can get minimal results quickly on the desktop, but the standards are different on the web. In my experience, a desktop app needs a lot more to be minimally functional than a web app, probably because the level of complexity is different. Yes, web apps can be just as complex as desktop apps; but I think a minimally functional web app is in many ways less complex than a minimally functional desktop app. Just think about all the menus, help files, and other accoutrements you need to get a desktop app minimally functional; web apps can get away with less.
3) The web technologies I depend on are more modern. Compared to Objective-C/Cocoa, Ruby is like a dream. Javascript and less so, but only because it seems more like what I'm used to on the desktop. What can I say, I like syntactic sugar and the readability that comes with it.
So, perhaps web programming is hard, but there are several ways travelling the path is made easier - maybe even easier than on the desktop.
Of course for a developer it's necessary to have some knowledge of html primarily, but no real need for deep knowledge. Not in my, somewhat limited, experience anyway.
I am constantly reminded of this by Louis CK http://www.youtube.com/watch?v=8r1CZTLk-Gk
It's something my fellow hard-core programmer friends will never understand. I love my job and what I do.
Web Development rules!
Yes, it's a somewhat different skillset working with somewhat different software, but there's not that much difference.
lol wut?