I'm in the same boat you're in and for the first time in my life find myself rearranging code to bring compile times down, using Valgrind, and using Boost.Python for sanity.
The world needs a decent systems language (not C, maybe C++) with easy automated integration with a higher-productivity language like Python or C# -- maybe a closely integrated pair or family of languages, or maybe a single language working in "Safe" and "Unsafe" modes..Net seems to be in the neighborhood by accident, Stroustrup is showing some interest, Boost.Python users know the value of it (but have to work way too hard), and Common Lispers have known the answer for decades (but have developed a fierce bias against any integration between languages or programs -- it's all one big Lisp system or nothing). Efforts to retrofit such integration onto existing languages seem hopelessly complicated and difficult, so this looks like a problem for language designers. With all this beating around the bush, we should get something useful in the next twenty years -- too bad for anyone who isn't young enough to look forward to it:-P
It's better not to encourage the belief that one language can be good for everything. Students invest themselves in that belief quite strongly anyway just because of wishful thinking.
They also acquire the belief that unfamiliar syntax is a serious barrier to learning a new language. Forcing students to learn a few languages with different-looking syntax might help. The superstition seems to be reinforced by the fact that their every attempt to learn a new language lasts about two weeks, so giving them brief exposures in a class about programming language concepts would only reinforce it. Better to teach a language by making it the official language of a certain class and requiring that all programs for the class be written in it.
Right. Black hat hackers really want boring, defensive corporate jobs; they just need a foot in the door. It's just like the time a teenager did donuts on my lawn, and I hired him as a chauffeur, because what he REALLY wanted was to wear a silly little hat and be at his employer's beck and call ten hours a day.
There's no risk of them getting bored and using your company resources to attack other targets, because they love bourgeois success too much to risk it for a thrill.
White hat hackers, on the other hand, are completely unemployable. They're whistleblowers waiting to happen.
Have you ever even HEARD of Eclipse ? Hello ? Open Source Multi-platform Java and User-interface development ( with pluggable C/C++ support out of the gate to boot ! ).
C++ and Java are extremely static languages. The proliferation of boilerplate and superclasess/interfaces is just amazing, plus you get extra boilerplate because of the lack of support for functions and closures. Everything gets implemented as a class instance, and every time you want to make something dynamic (what isn't dynamic in a user interface these days?) you have to create another interface.
Anyway, why should we assume you know more about Common Lisp than he knows about C++ and Java?
I do most of my work in C++ (so you know I appreciate the power of compile-time type analysis,) but my GUI programming has been limited to Java and Python. (Python's dynamic nature is weak and clunky compared to Lisp, but it sufficiently superior to Java to be a stand-in for Lisp in this discussion.) I program much faster in Python, and my couple-day Python hacks typically beat the hell out of my planned, weeks-long Java GUI projects for functionality and usability. The only point where my Java apps win is the sense of grandiosity and accomplishment, because my Java apps are so frickin' big and perfect. (Actually, I never use my Java apps, but I keep the source code around in case I have to show it to someone to prove my Java chops. Java gives you a wonderful proud feeling of doing everything the right way, as nature and Sun intended.)
The difference is not so much in direct calls to the GUI system but in the code that surrounds and supports the GUI calls. The windowing library I use in Python, wxPython, doesn't hold a candle to Swing in terms of its customizability and extendability (AFAICT) but I program so much faster in Python that I work around wxPython (or my limited knowledge of it) faster than I can program to the built-in extensibility hooks in Swing. It wouldn't matter much if the actual windowing code were generated by a wizard, because most of the complexity is in things like, "When should this menu item be grayed out? What commands should be available in this tab? What will the user want to do after doing X? How do I accomodate this unanticipated class of use cases?" This kind of programming has inherently fewer static patterns that can be usefully captured as superclasses and interfaces. The patterns that appear are usually better left unstated, because very soon a new use case will show they were accidental, not essential; however, Java and C++ leave you very little freedom to leave anything unstated, forcing you to constantly revise, retract, and rewrite things that you never wanted to say in the first place.
Comparing Java to C and C++, Jamie Zawinski said:
Java doesn't have free().
I have to admit right off that, after that, all else is gravy. That one point makes me able to forgive just about anything else, no matter how egregious. Given this one point, everything else in this document fades nearly to insignificance.
When it comes to GUI programming, I say the same thing about dynamic languages vs. Java and C++. Being liberated from the concrete shoes of interfaces and superclasses and "everything is a class instance" makes every other difference fade into insignificance. It far outweighs the benefit of compile-time type analysis. I don't believe this is true of all programming; I am not about to give up C++ for most of the work I do. However, in my experience it is true of user interface programming.
P.S. I ignored the magic words "management" and "enterprise" because neither the GP nor the OP said anything about them.
There are plenty of valuable skills that one can learn that do not require algebra or high school literacy. We just don't teach most of them until they've "failed" real school. Not knowing algebra or Shakespeare doesn't make you stupid. But not having any valuable skills at all makes it hard to support yourself.
Reading and writing do not equal Shakespeare. Reading and writing and word problems help you with any job, including being a janitor or working at an auto parts store. Some kinds of janitors are supposed to read chemical safety data sheets. It might not be fair, but there you go. It's pointless to teach those "valuable skills" you're talking about unless you have an economic crystal ball. The kids will have to learn on the job, which means reading, writing, word problems, and following directions. (Basic computer literacy should also be taught to everyone, obviously, though I neglected to mention it before.)
I'm sorry, but "you just have to make him do it" could be about the worst educational advice I've ever heard. You're right that you have to light a passion in kids.
The vast majority of kids go through the vast majority of their schoolwork taking the path of least resistance. They learn quite a lot that way. Even I learned a whole lot that way, and I'm a huge nerd who was easily excited by schoolwork. Once in a while kids get a special teacher and really light up, and that's great, but if they aren't learning when they aren't passionate, then they aren't learning much at all. The trick is to make sure the path of least resistance leads them to learning and not to dropping out.
And if that's all you teach and all you test, the kid will conclude, hey, maybe school's not for me. And who could blame him?
No one can really blame him, because no one has convinced him that his basic skills are important and that he can improve them. Even if he has a sensible goal in mind, like "I'm going to be a field tech for the local gas company," he isn't thinking about the fact that his everyday duties will require reading manuals, reading work orders, doing basic math, and filling out reports. The basic skills are basic to practically everyone, no matter what job they're doing. There are a lot of people who would like to say that reading and writing aren't their thing, and there aren't enough non-reading and non-writing jobs to go around. A person who's weak at reading can hope to find a job where reading is less of a disadvantage, but that's the best he can hope for.
And how would you prepare a kid to be a cable company field tech? Reading is obviously important. Writing is important. Math and science are kind of important; it's obviously a waste to teach the specifics of Time Warner's business, so you teach abstract stuff like algebra and electric circuits, which is exactly the egghead crap that he's dropping out to avoid.
I think your line of reasoning takes you to apprenticeships and local trade schools. (The public school system is way too slow to change and would always be training kids on jobs and technologies that existed five years ago.) That isn't such a bad idea, but it isn't really different from dropping out of high school, except that it's dropping out with a plan and with social approval. I expect that most kids graduating from vocational school would not have any advantage over high school graduates with no special skills, but maybe it would be a step in the right direction to give them a way out of high school that didn't stamp a big "F" on their foreheads.
You have it completely backward. What holds most people back from getting better jobs is their ability to read quickly, write professionally, handle simple quantitative concepts when stated in words, and follow directions reliably. In other words, reading, writing, word problems, and following directions. Schools are focused on practical things; the kids just don't believe it.
One problem is that most kids have no access to credible adults who can tell them how the world works. The parents are generally more credible than teachers, and if it were okay for kids to turn out like their parents, then the school system would be fine as-is. Most teachers seal themselves off in a little world of their own; they're spooky people to talk to. The kids can tell that the world teachers live in is very small and very cut off from the real world. The kids know, for instance, that the way they relate to their teachers does not teach them anything about how adults relate to each other. It's no wonder, then, that kids fail to believe it when teachers say that developing the ability to write papers and do word problems will result in higher income later. Confirmation of this idea can be found in how much better kids do when they find a teacher they really admire and trust. Often the difference is not teaching ability, but simply credibility. Students feel much better and perform much better when they trust that the teacher knows what will be good for them down the road.
Another very basic problem is that kids are kids. They aren't ready to prepare for a $20k per year job. They're still seriously considering careers in music, professional athletics, and crime. You can't tell a kid that reading is a serious, practical skill and he needs all the practice he can get. You can't tell him that doing algebra word problems is actually making him clever in ways that might get him promoted from salesman to sales manager at the Electronics Shack. You just have to make him do it.
Re:fallacies don't exist within methodologies
on
You Call This Agile?
·
· Score: 1
Methodologies and processes are meant to ensure success of the average worker not the best.
Methodologies and processes are about making people with no taste or judgment perform at the same level as people who do. It just isn't possible. The effort would be better spent coaching those people to improve their judgment.
Analogously, development groups that perform code reviews do much better than development groups that teach dogmatic and limited definitions of good design.
Why would anyone have a need to write a simple spider nowadays?
You're right. Web 2.0 changes everything. Some people are just conservative, though. My parents are still using bookshelves even though maglev trains made bookshelves obsolete decades ago.
In 2006, there has to be a better way than just following links. For example, it would be interesting to see something that crawled the various social bookmarking sites and corelated the various terms.
You mean follow links and *gasp* do something with the data you find? It'll never happen. The experts have found that following random links for no particular reason and ignoring the data found there is sufficient for all purposes, and your spunky challenge to this paradigm will not be allowed to stand!
You must have tons of time on your hands for those crawlers....
You can make any program difficult hard by increasing the generality and performance requirements, but there's nothing inherently difficult about screen-scraping from a web site. I've written a few scripts to extract data from web sites, and they're quite simple if your aims are modest. The first crawler I wrote was also my first Perl project, my first time using HTTP, and my first time dealing with HTML. Given a date, it generated a URL, visited that page, extracted some links, followed the links, extracted some text from the pages it found, and printed a report for me. That qualifies as a "crawler" or "spider" given the definition in play here (it "traverses the internet" by following a link,) but there was nothing especially hard about it.
The people who get rich are the talented people with vision and an understanding of their own self-worth.
... and a desire to measure that self-worth in dollars. That includes most people, but not everybody. Think of all the very bright people who get PhDs and end up in little tiny nowhere towns in Georgia because they'd rather make peanuts at an academic job in BFE than live comfortably in a happening place and work in marketing.
Almost as good would be to code the slow, portable way, make sure it really is too slow, and then code a specialization for each database you support. Then you don't get gratuitous incompatibilities, and anyone who knows database X can add support for database X without being a specialist in the database(s) you already support. The downside is that it increases your testing burden by one, which may seem like a lot when you only support one database to begin with, but I imagine it pays for itself when you start supporting a ton of databases. Some users might even be able to use the nonspecialized layer with an unsupported database, in a pinch, if their performance requirements are modest.
Running away is the right choice. Being a "fixer" for a dysfunctional team is a job for an experienced guy with credibility and authority, who will probably be very well paid for it. A junior guy who needs to "Ask Slashdot" will not be able to make a dent in his colleagues' sloppy practices. Besides, if you're an inexperienced coder, you should be learning from people who do things right, not struggling with crappy people who set a negative example and make it hard for you to follow good practices.
C becomes an all-purpose language under the hypothesis of infinite development resources. Python becomes an all-purpose language under the hypothesis of infinite computational resources. Neither hypothesis is true, but either might be a useful approximation of a given situation.
Anyway, the whole question is rendered moot by the ability to embed Python in C++ and call C++ libraries from Python. It might seem ironic to you given your preconceptions, but Python brings C++ much closer to being an all-purpose programming languages than it could ever be on its own. Python makes C++ programming tolerable by allowing you to strike the unpleasant parts of Greenspun's Tenth Rule of Programming (which I take to apply to C++.)
I give you Greenspun's Tenth Rule, Boost.Python version: "A C++ program that uses Boost.Python gets a mature, well-documented, slow implementation of half of Common Lisp without the burden of maintenance."
Working on a "prominent website" screams boooooorinnnnngg. If you need talented people, you must have interesting problems. Advertise your problems, and you'll find people who want to work on them.
I bet us rich Westerners will be able to get our hands on it somehow:-) I may buy two just to thank them for bringing some sense to the mobile phone market. I have been begging for this phone for six years.
Prior to Motorola's Razr and now the Motofone, the logic has been:
"We can't make it small without making it expensive. We can't sell an expensive phone without a ton of features. So let's cram the features in... oops, it isn't really small anymore, but oh well."
I am also curious to hear an official statement. In the past people calling themselves Firefox developers have claimed on Slashdot that there is no memory usage problem, no valid bug report, and no effort to fix anything, because no Firefox developer can reproduce the problem. Other people calling themselves Firefox developers have made posts contradicting this, saying that a few developers are working on it, but not very many because it has turned out to be such a tough problem. Please, let us hear the story from an authoritative source.
Congratulations, you don't encounter the bug. If it affected everybody, it would have been fixed by now.
Myself, I see the bug under Windows and not under Linux. My browsing habits are vastly different between the two machines; that could have something to do with it. Or maybe it's a plugin. Perhaps Firefox's resource usage should be instrumented, with hooks in the plugin interface, so misbehaving plugins can be detected, if only by process of elimination.
Most likely they migrated to Windows 2000 versions of most of those Windows 98 apps... there's a reason Microsoft bends over backwards to provide backward compatibility for developers. Moving from FooApp v.whatever to FooApp v.(whatever + 6) is probably easier than moving from FooApp to similarly-functional BarApp. In moving from Word 98 to Word 2003, the users just need 80 hours of training because some menu items moved from one drop-down menu to another. Between Word 2003 to OpenOffice, some functionality is under menu items with different names, so you have to kill the old users and train new ones from scratch.
In my case, the reason I became good is because I went to several different jobs, and in each job there was some sort of major problem that the company or team had been dealing with for a while, that I decided I could solve. The difference between that and solving useless problems in my spare time is that a.) it makes my job easier, and b.) I'm getting paid for it.
I've found that very fruitful as well, because you're guaranteed to get genuinely hard problems and develop genuinely rare and valuable skills. You may have difficulty getting official approval to tackle an "impossible" task, but you can still work on it in your spare time. Three tips to anyone taking this route:
1. Keep your off-time work quiet. Management may not understand that you're doing it as a personal choice in your spare time; they may reason that if you're working on something useful to the company, then you're at work and they have the right to decide what you work on and how. Definitely avoid using scarce company resources. Rather than going through official channels to acquire assistance and information, go straight to the source. Use beer.
2. As soon as you have convincing evidence that it will work, call it a prototype and get official approval to finish it. Even if it's already completely done, still call it a prototype and get official approval to finish it. This helps with item 3:
3. After the fact, make sure management has a clear idea how much time went into it. This isn't just because you want to brag about how hard you're working; it's because their expectations of what it will cost to improve and maintain it will be based on how much it costs in the first place. If they think it appeared magically, they will expect you to maintain it magically, too.
After you do one or two projects like this, people will start to ask for you to tackle their irksome tasks. Your manager will lend you out to people with hard problems in exchange for favors back from them. Nice life:-)
Programmers don't waste memory gratuitously; they do it because resource usage is only one concern of many that compete for their attention. They do their best to allocate effort where it is needed and will benefit people, and it sounds like they are responding enthusiastically to the demand for thrifty resource usage raised by the OLPC project. This is not just a stupid excuse that developers make. (Or if it is, they have good company in Blaise Pascal: "I have only made this letter rather long because I have not had time to make it shorter.")
Wow, the Forbes writer does a great job of executing a classic tactic. Where did they get this guy, out of a time machine? Stallman would do well to consider the basis of this attack and the harm it can do to him, by considering the fate of PETA. PETA and the free software movement have a few things in common. They're both the pure, hard-core, radical focus of a large, nebulous group of people who share vaguely similar ideals. (PETA's nebula is vegetarians, flexitarians, and animal-lovers; the FSF's nebula is open-source programmers and intellectual property rights reformers.) Both have a tendency to treat their allies as worthless failures or as enemies. Both can be largely neutered by isolating them and making them look silly. PETA, through its PR stunts, has embraced this fate and become somewhat of a joke and a useless entity, so they serve as a warning to FSFers who might want to take that path.
PETA members see their PR stunts as ways of raising PETA's profile, getting word out to potential converts, and growing the movement. They accomplish nothing of the kind, of course; they do nothing to help them break out of the fringe and make it easy for the MSM to keep them pigeonholed as a bunch of freaks. The stunts are just to fulfill the leaders' attention whoredom, flatter the members with comparisons to civil rights demonstrations, and help the members pretend that the "revolution" can be advanced by dramatic action. Real converts to PETA's cause are won by good writing, dissemination of credible information, and gentle peer influence, tactics despised by PETA as hopelessly compromised and non-revolutionary. PETA does a bit of this work, somewhat grudgingly it seems, but they don't admit its importance. These true means of advance are dispiritingly slow and boring, and PETA's zealous converts need circuses to keep their spirits up.
If Stallman wants his movement to be influential, he has to accept that it will advance through good writing (of which he has done more than his fair share) and a slow process of convincing and influencing programmers. Stallman's assets are the respect he has earned and the power and appeal of his ideas. No one can develop software in the US without eventually hearing of rms, the GPL, and Free Software. Applied over years, they can (and obviously have) exert great influence. Unfortunately, Stallman sometimes seems to scorn his success and jeopardize it in search of something more pure. He even seems to view Linux as a failure because the fame and success of Linux has outstripped that of Free Software. That is not just deludedly optimistic; it is wrongheaded. That's like getting pissed off because not everyone who eats tofu is a vegan. The majority of the people you influence will embody a mediocre and impure copy of your vision -- especially initially. Stallman should take Linux as a model to be replicated, an amazing success in which many, many people who do not share Stallman's revolutionary fervor embraced and advanced his ideas.
You can't turn everyone into a revolutionary. Most people are too pragmatic, too settled, self-centered, whatever you want to call it. If Stallman wants his idea to take over the world, he has to accept that its instantiation in the mind of a Torvalds or a J. Corporate Programmer will lack the revolutionary tang that, in his mind, makes it worthwhile. If he backs away from the PETA approach and accepts that the role of a true believer is to be the center of a mass of less ideological, less committed, less perfect allies, then he can continue to influence them through their respect and admiration for him.
Sure they do. What else do you call Newtonian mechanics?
But that's not the spirit in which I wrote my post. A massive, incorrect generalization is no good for making a point in an argument but may be useful for communicating the gist of a thought. If I had bothered to add all the "some"s and "many"s and "mostly"s necessary to hedge the post against comments like yours, it would have been three times as long with the same amount of content. Who would that have benefited?
People with strong math skills do live in a more precise world with higher standards -- standards that they impose upon themselves. Happiness, social integration, and status require adapting oneself to the reactions of others, and it is served by an ability to negotiate for oneself in society to mitigate negative reactions. A positive attitude towards oneself is helpful, because it rubs off on other people, sowing affection and respect. Intellectual achievement depends on the opposite -- internalizing a set of impersonal standards, policing one's own adherence to them, and submitting to one's judgment rather than attempting to get away with murder. A negative attitude toward oneself is helpful, because it makes one more sensitive to one's faults.
A social person learns to be agreeable and please other people through charm, good looks, humor, and compassion. An intellectual person attempts to earn approval by eradicating his defects, making fewer errors, and achieving understanding, things that do not naturally induce happiness in other people.
A social person plunges ahead according to his current understanding and worries about nothing so long as people are pleasant to him. If they become unhappy with him, he adapts. A critical person examines himself constantly for mistakes, attempts to avoid unnecessary errors, and searches for ways to improve.
Socially oriented people consider the critical, intellectual approach a real downer, a pointless exercise in misery. A problem becomes a problem when it makes people unhappy, so the ability to spot problems that others can't is simply a talent for manufacturing unhappiness. Critically oriented people consider socially oriented people to be irresponsible parasites who refuse to do their share of the work necessary to keep society functioning and produce the wonderful things -- science, art, material luxuries -- that make life worth living.
Be paid to help any big company expand by commoditizing their complements. (As usual for Joel, you can't tell whether it's his own idea or whether there's another, better treatment out there.)
I'm in the same boat you're in and for the first time in my life find myself rearranging code to bring compile times down, using Valgrind, and using Boost.Python for sanity.
.Net seems to be in the neighborhood by accident, Stroustrup is showing some interest, Boost.Python users know the value of it (but have to work way too hard), and Common Lispers have known the answer for decades (but have developed a fierce bias against any integration between languages or programs -- it's all one big Lisp system or nothing). Efforts to retrofit such integration onto existing languages seem hopelessly complicated and difficult, so this looks like a problem for language designers. With all this beating around the bush, we should get something useful in the next twenty years -- too bad for anyone who isn't young enough to look forward to it :-P
The world needs a decent systems language (not C, maybe C++) with easy automated integration with a higher-productivity language like Python or C# -- maybe a closely integrated pair or family of languages, or maybe a single language working in "Safe" and "Unsafe" modes.
It's better not to encourage the belief that one language can be good for everything. Students invest themselves in that belief quite strongly anyway just because of wishful thinking.
They also acquire the belief that unfamiliar syntax is a serious barrier to learning a new language. Forcing students to learn a few languages with different-looking syntax might help. The superstition seems to be reinforced by the fact that their every attempt to learn a new language lasts about two weeks, so giving them brief exposures in a class about programming language concepts would only reinforce it. Better to teach a language by making it the official language of a certain class and requiring that all programs for the class be written in it.
Right. Black hat hackers really want boring, defensive corporate jobs; they just need a foot in the door. It's just like the time a teenager did donuts on my lawn, and I hired him as a chauffeur, because what he REALLY wanted was to wear a silly little hat and be at his employer's beck and call ten hours a day.
There's no risk of them getting bored and using your company resources to attack other targets, because they love bourgeois success too much to risk it for a thrill.
White hat hackers, on the other hand, are completely unemployable. They're whistleblowers waiting to happen.
C++ and Java are extremely static languages. The proliferation of boilerplate and superclasess/interfaces is just amazing, plus you get extra boilerplate because of the lack of support for functions and closures. Everything gets implemented as a class instance, and every time you want to make something dynamic (what isn't dynamic in a user interface these days?) you have to create another interface.
Anyway, why should we assume you know more about Common Lisp than he knows about C++ and Java?
I do most of my work in C++ (so you know I appreciate the power of compile-time type analysis,) but my GUI programming has been limited to Java and Python. (Python's dynamic nature is weak and clunky compared to Lisp, but it sufficiently superior to Java to be a stand-in for Lisp in this discussion.) I program much faster in Python, and my couple-day Python hacks typically beat the hell out of my planned, weeks-long Java GUI projects for functionality and usability. The only point where my Java apps win is the sense of grandiosity and accomplishment, because my Java apps are so frickin' big and perfect. (Actually, I never use my Java apps, but I keep the source code around in case I have to show it to someone to prove my Java chops. Java gives you a wonderful proud feeling of doing everything the right way, as nature and Sun intended.)
The difference is not so much in direct calls to the GUI system but in the code that surrounds and supports the GUI calls. The windowing library I use in Python, wxPython, doesn't hold a candle to Swing in terms of its customizability and extendability (AFAICT) but I program so much faster in Python that I work around wxPython (or my limited knowledge of it) faster than I can program to the built-in extensibility hooks in Swing. It wouldn't matter much if the actual windowing code were generated by a wizard, because most of the complexity is in things like, "When should this menu item be grayed out? What commands should be available in this tab? What will the user want to do after doing X? How do I accomodate this unanticipated class of use cases?" This kind of programming has inherently fewer static patterns that can be usefully captured as superclasses and interfaces. The patterns that appear are usually better left unstated, because very soon a new use case will show they were accidental, not essential; however, Java and C++ leave you very little freedom to leave anything unstated, forcing you to constantly revise, retract, and rewrite things that you never wanted to say in the first place.
Comparing Java to C and C++, Jamie Zawinski said:
When it comes to GUI programming, I say the same thing about dynamic languages vs. Java and C++. Being liberated from the concrete shoes of interfaces and superclasses and "everything is a class instance" makes every other difference fade into insignificance. It far outweighs the benefit of compile-time type analysis. I don't believe this is true of all programming; I am not about to give up C++ for most of the work I do. However, in my experience it is true of user interface programming.
P.S. I ignored the magic words "management" and "enterprise" because neither the GP nor the OP said anything about them.
This isn't a useless trick. It can be used to train Aspies and other autistics to express and recognize emotions.
Reading and writing do not equal Shakespeare. Reading and writing and word problems help you with any job, including being a janitor or working at an auto parts store. Some kinds of janitors are supposed to read chemical safety data sheets. It might not be fair, but there you go. It's pointless to teach those "valuable skills" you're talking about unless you have an economic crystal ball. The kids will have to learn on the job, which means reading, writing, word problems, and following directions. (Basic computer literacy should also be taught to everyone, obviously, though I neglected to mention it before.)
The vast majority of kids go through the vast majority of their schoolwork taking the path of least resistance. They learn quite a lot that way. Even I learned a whole lot that way, and I'm a huge nerd who was easily excited by schoolwork. Once in a while kids get a special teacher and really light up, and that's great, but if they aren't learning when they aren't passionate, then they aren't learning much at all. The trick is to make sure the path of least resistance leads them to learning and not to dropping out.
No one can really blame him, because no one has convinced him that his basic skills are important and that he can improve them. Even if he has a sensible goal in mind, like "I'm going to be a field tech for the local gas company," he isn't thinking about the fact that his everyday duties will require reading manuals, reading work orders, doing basic math, and filling out reports. The basic skills are basic to practically everyone, no matter what job they're doing. There are a lot of people who would like to say that reading and writing aren't their thing, and there aren't enough non-reading and non-writing jobs to go around. A person who's weak at reading can hope to find a job where reading is less of a disadvantage, but that's the best he can hope for.
And how would you prepare a kid to be a cable company field tech? Reading is obviously important. Writing is important. Math and science are kind of important; it's obviously a waste to teach the specifics of Time Warner's business, so you teach abstract stuff like algebra and electric circuits, which is exactly the egghead crap that he's dropping out to avoid.
I think your line of reasoning takes you to apprenticeships and local trade schools. (The public school system is way too slow to change and would always be training kids on jobs and technologies that existed five years ago.) That isn't such a bad idea, but it isn't really different from dropping out of high school, except that it's dropping out with a plan and with social approval. I expect that most kids graduating from vocational school would not have any advantage over high school graduates with no special skills, but maybe it would be a step in the right direction to give them a way out of high school that didn't stamp a big "F" on their foreheads.
One problem is that most kids have no access to credible adults who can tell them how the world works. The parents are generally more credible than teachers, and if it were okay for kids to turn out like their parents, then the school system would be fine as-is. Most teachers seal themselves off in a little world of their own; they're spooky people to talk to. The kids can tell that the world teachers live in is very small and very cut off from the real world. The kids know, for instance, that the way they relate to their teachers does not teach them anything about how adults relate to each other. It's no wonder, then, that kids fail to believe it when teachers say that developing the ability to write papers and do word problems will result in higher income later. Confirmation of this idea can be found in how much better kids do when they find a teacher they really admire and trust. Often the difference is not teaching ability, but simply credibility. Students feel much better and perform much better when they trust that the teacher knows what will be good for them down the road.
Another very basic problem is that kids are kids. They aren't ready to prepare for a $20k per year job. They're still seriously considering careers in music, professional athletics, and crime. You can't tell a kid that reading is a serious, practical skill and he needs all the practice he can get. You can't tell him that doing algebra word problems is actually making him clever in ways that might get him promoted from salesman to sales manager at the Electronics Shack. You just have to make him do it.
Methodologies and processes are about making people with no taste or judgment perform at the same level as people who do. It just isn't possible. The effort would be better spent coaching those people to improve their judgment.
Analogously, development groups that perform code reviews do much better than development groups that teach dogmatic and limited definitions of good design.
You're right. Web 2.0 changes everything. Some people are just conservative, though. My parents are still using bookshelves even though maglev trains made bookshelves obsolete decades ago.
You mean follow links and *gasp* do something with the data you find? It'll never happen. The experts have found that following random links for no particular reason and ignoring the data found there is sufficient for all purposes, and your spunky challenge to this paradigm will not be allowed to stand!
You can make any program difficult hard by increasing the generality and performance requirements, but there's nothing inherently difficult about screen-scraping from a web site. I've written a few scripts to extract data from web sites, and they're quite simple if your aims are modest. The first crawler I wrote was also my first Perl project, my first time using HTTP, and my first time dealing with HTML. Given a date, it generated a URL, visited that page, extracted some links, followed the links, extracted some text from the pages it found, and printed a report for me. That qualifies as a "crawler" or "spider" given the definition in play here (it "traverses the internet" by following a link,) but there was nothing especially hard about it.
Almost as good would be to code the slow, portable way, make sure it really is too slow, and then code a specialization for each database you support. Then you don't get gratuitous incompatibilities, and anyone who knows database X can add support for database X without being a specialist in the database(s) you already support. The downside is that it increases your testing burden by one, which may seem like a lot when you only support one database to begin with, but I imagine it pays for itself when you start supporting a ton of databases. Some users might even be able to use the nonspecialized layer with an unsupported database, in a pinch, if their performance requirements are modest.
Running away is the right choice. Being a "fixer" for a dysfunctional team is a job for an experienced guy with credibility and authority, who will probably be very well paid for it. A junior guy who needs to "Ask Slashdot" will not be able to make a dent in his colleagues' sloppy practices. Besides, if you're an inexperienced coder, you should be learning from people who do things right, not struggling with crappy people who set a negative example and make it hard for you to follow good practices.
Anyway, the whole question is rendered moot by the ability to embed Python in C++ and call C++ libraries from Python. It might seem ironic to you given your preconceptions, but Python brings C++ much closer to being an all-purpose programming languages than it could ever be on its own. Python makes C++ programming tolerable by allowing you to strike the unpleasant parts of Greenspun's Tenth Rule of Programming (which I take to apply to C++.)
I give you Greenspun's Tenth Rule, Boost.Python version: "A C++ program that uses Boost.Python gets a mature, well-documented, slow implementation of half of Common Lisp without the burden of maintenance."
Working on a "prominent website" screams boooooorinnnnngg. If you need talented people, you must have interesting problems. Advertise your problems, and you'll find people who want to work on them.
I bet us rich Westerners will be able to get our hands on it somehow :-) I may buy two just to thank them for bringing some sense to the mobile phone market. I have been begging for this phone for six years.
Prior to Motorola's Razr and now the Motofone, the logic has been:
"We can't make it small without making it expensive. We can't sell an expensive phone without a ton of features. So let's cram the features in... oops, it isn't really small anymore, but oh well."
I am also curious to hear an official statement. In the past people calling themselves Firefox developers have claimed on Slashdot that there is no memory usage problem, no valid bug report, and no effort to fix anything, because no Firefox developer can reproduce the problem. Other people calling themselves Firefox developers have made posts contradicting this, saying that a few developers are working on it, but not very many because it has turned out to be such a tough problem. Please, let us hear the story from an authoritative source.
Congratulations, you don't encounter the bug. If it affected everybody, it would have been fixed by now.
Myself, I see the bug under Windows and not under Linux. My browsing habits are vastly different between the two machines; that could have something to do with it. Or maybe it's a plugin. Perhaps Firefox's resource usage should be instrumented, with hooks in the plugin interface, so misbehaving plugins can be detected, if only by process of elimination.
Most likely they migrated to Windows 2000 versions of most of those Windows 98 apps... there's a reason Microsoft bends over backwards to provide backward compatibility for developers. Moving from FooApp v.whatever to FooApp v.(whatever + 6) is probably easier than moving from FooApp to similarly-functional BarApp. In moving from Word 98 to Word 2003, the users just need 80 hours of training because some menu items moved from one drop-down menu to another. Between Word 2003 to OpenOffice, some functionality is under menu items with different names, so you have to kill the old users and train new ones from scratch.
I've found that very fruitful as well, because you're guaranteed to get genuinely hard problems and develop genuinely rare and valuable skills. You may have difficulty getting official approval to tackle an "impossible" task, but you can still work on it in your spare time. Three tips to anyone taking this route:
1. Keep your off-time work quiet. Management may not understand that you're doing it as a personal choice in your spare time; they may reason that if you're working on something useful to the company, then you're at work and they have the right to decide what you work on and how. Definitely avoid using scarce company resources. Rather than going through official channels to acquire assistance and information, go straight to the source. Use beer.
2. As soon as you have convincing evidence that it will work, call it a prototype and get official approval to finish it. Even if it's already completely done, still call it a prototype and get official approval to finish it. This helps with item 3:
3. After the fact, make sure management has a clear idea how much time went into it. This isn't just because you want to brag about how hard you're working; it's because their expectations of what it will cost to improve and maintain it will be based on how much it costs in the first place. If they think it appeared magically, they will expect you to maintain it magically, too.
After you do one or two projects like this, people will start to ask for you to tackle their irksome tasks. Your manager will lend you out to people with hard problems in exchange for favors back from them. Nice life :-)
Programmers don't waste memory gratuitously; they do it because resource usage is only one concern of many that compete for their attention. They do their best to allocate effort where it is needed and will benefit people, and it sounds like they are responding enthusiastically to the demand for thrifty resource usage raised by the OLPC project. This is not just a stupid excuse that developers make. (Or if it is, they have good company in Blaise Pascal: "I have only made this letter rather long because I have not had time to make it shorter.")
Wow, the Forbes writer does a great job of executing a classic tactic. Where did they get this guy, out of a time machine? Stallman would do well to consider the basis of this attack and the harm it can do to him, by considering the fate of PETA. PETA and the free software movement have a few things in common. They're both the pure, hard-core, radical focus of a large, nebulous group of people who share vaguely similar ideals. (PETA's nebula is vegetarians, flexitarians, and animal-lovers; the FSF's nebula is open-source programmers and intellectual property rights reformers.) Both have a tendency to treat their allies as worthless failures or as enemies. Both can be largely neutered by isolating them and making them look silly. PETA, through its PR stunts, has embraced this fate and become somewhat of a joke and a useless entity, so they serve as a warning to FSFers who might want to take that path.
PETA members see their PR stunts as ways of raising PETA's profile, getting word out to potential converts, and growing the movement. They accomplish nothing of the kind, of course; they do nothing to help them break out of the fringe and make it easy for the MSM to keep them pigeonholed as a bunch of freaks. The stunts are just to fulfill the leaders' attention whoredom, flatter the members with comparisons to civil rights demonstrations, and help the members pretend that the "revolution" can be advanced by dramatic action. Real converts to PETA's cause are won by good writing, dissemination of credible information, and gentle peer influence, tactics despised by PETA as hopelessly compromised and non-revolutionary. PETA does a bit of this work, somewhat grudgingly it seems, but they don't admit its importance. These true means of advance are dispiritingly slow and boring, and PETA's zealous converts need circuses to keep their spirits up.
If Stallman wants his movement to be influential, he has to accept that it will advance through good writing (of which he has done more than his fair share) and a slow process of convincing and influencing programmers. Stallman's assets are the respect he has earned and the power and appeal of his ideas. No one can develop software in the US without eventually hearing of rms, the GPL, and Free Software. Applied over years, they can (and obviously have) exert great influence. Unfortunately, Stallman sometimes seems to scorn his success and jeopardize it in search of something more pure. He even seems to view Linux as a failure because the fame and success of Linux has outstripped that of Free Software. That is not just deludedly optimistic; it is wrongheaded. That's like getting pissed off because not everyone who eats tofu is a vegan. The majority of the people you influence will embody a mediocre and impure copy of your vision -- especially initially. Stallman should take Linux as a model to be replicated, an amazing success in which many, many people who do not share Stallman's revolutionary fervor embraced and advanced his ideas.
You can't turn everyone into a revolutionary. Most people are too pragmatic, too settled, self-centered, whatever you want to call it. If Stallman wants his idea to take over the world, he has to accept that its instantiation in the mind of a Torvalds or a J. Corporate Programmer will lack the revolutionary tang that, in his mind, makes it worthwhile. If he backs away from the PETA approach and accepts that the role of a true believer is to be the center of a mass of less ideological, less committed, less perfect allies, then he can continue to influence them through their respect and admiration for him.
Sure they do. What else do you call Newtonian mechanics?
But that's not the spirit in which I wrote my post. A massive, incorrect generalization is no good for making a point in an argument but may be useful for communicating the gist of a thought. If I had bothered to add all the "some"s and "many"s and "mostly"s necessary to hedge the post against comments like yours, it would have been three times as long with the same amount of content. Who would that have benefited?
People with strong math skills do live in a more precise world with higher standards -- standards that they impose upon themselves. Happiness, social integration, and status require adapting oneself to the reactions of others, and it is served by an ability to negotiate for oneself in society to mitigate negative reactions. A positive attitude towards oneself is helpful, because it rubs off on other people, sowing affection and respect. Intellectual achievement depends on the opposite -- internalizing a set of impersonal standards, policing one's own adherence to them, and submitting to one's judgment rather than attempting to get away with murder. A negative attitude toward oneself is helpful, because it makes one more sensitive to one's faults.
A social person learns to be agreeable and please other people through charm, good looks, humor, and compassion. An intellectual person attempts to earn approval by eradicating his defects, making fewer errors, and achieving understanding, things that do not naturally induce happiness in other people.
A social person plunges ahead according to his current understanding and worries about nothing so long as people are pleasant to him. If they become unhappy with him, he adapts. A critical person examines himself constantly for mistakes, attempts to avoid unnecessary errors, and searches for ways to improve.
Socially oriented people consider the critical, intellectual approach a real downer, a pointless exercise in misery. A problem becomes a problem when it makes people unhappy, so the ability to spot problems that others can't is simply a talent for manufacturing unhappiness. Critically oriented people consider socially oriented people to be irresponsible parasites who refuse to do their share of the work necessary to keep society functioning and produce the wonderful things -- science, art, material luxuries -- that make life worth living.
Be paid to help any big company expand by commoditizing their complements. (As usual for Joel, you can't tell whether it's his own idea or whether there's another, better treatment out there.)