I believe it really does boil down a fundamental question once all of that has been stripped away: do we believe that a person has a right to the income they've earned?
Income earned by exchanging time and skill is certainly deserved. Income accumulated through financial mechanisms that require no time or skill on the part of the recipient is debatable. The latter category is even termed "unearned income" by the IRS.
If I worked 60 hrs/week for 50 years, accumulated $1 million after taxes, and put all that money into a foundation that had its own staff accountant and lawyer, the original million would grow from interest indefinitely, pay the salaries of its management staff, and still produce a tidy annual income for one lucky person. That person would be able to do nothing the rest of their lives and still the foundation would grow and provide even larger incomes for more of their descendants. After two generations it could a dozen people living $100,000 per year lives. Given that those lucky beneficiaries are living in flat violation to the American work ethic, when is it OK to say enough?
Now let's add two twists.
First, suppose I accumulated that $1 million a hundred fifty years ago using slave labor. The principle is now criminal money and by law can be confiscated to benefit the victims. What of the interest? By now, the criminal money has accumulated many times the original investment; should the proceeds of those investments also be confiscated?
Now suppose that, in addition, I was far from alone in doing this, but rather hundreds of entrepreneurs made their $1 million and now tens of thousands of descendants are living work-free lives. If the principle was all gained illegally, what do we do with it now?
This BTW is what really happened. Yes, plenty of "rich" people worked hard to retire well and pass on modest inheritances to their descendants. But the much wealthier ruling class are the inheritors of illegally obtained fortunes. They will get accepted into Ivy League schools despite crappy SAT scores; they will have access to free multi-million-dollar loans to start businesses and rescue failed ventures; they will have access to politics as a viable career option.
It's all very well to talk about redistributing income "fairly" but it's all ultimately done at the point of a gun.
Oh, you're a Libertarian. Nevermind then. We live in a perfect meritocracy where the current economic situation does in fact absolutely reflect the ethical Good. Carry on then.
In the Torah, it was dictated that wealth would be redistributed every 50 years. Remarkably prescient, that.
The Year of Jubilee was never actually observed in history. Nice idea, but when the time came to celebrate the bounty of the LORD, the Israelites decided that they wanted to keep their toys where they were.
These students, when they graduate and get real jobs, will have a >95% chance of using Windows in their job. What sense does it make to train them on a platform they have a 20:1 chance of never encountering?
The problem is that no matter what platform you train on, the one the students will use will be significantly different. Windows 3.1 was hugely different than Windows 95 -- much more different than Linux is from Windows XP. Windows Vista appears to be similarly different (at least in appearance) from Windows XP. I have seen five major shifts in desktop technology and people have adapted each time:
1. DOS: one application at a time, text-mode only, crappy batch language.
Mac: generally one application at a time, but with a GUI.
Almost no interoperability between them due to the Mac disk drive hardware.
Others: Commodore 64/128, Atari, Apple ][ c/e/gs, Xenix : People actually ran businesses on these.
Me: elementary school and early junior high.
2. Windows 3.x: multiple applications, crappy GUI.
Mac and PowerMac: much nicer GUI, similar multi-tasking as Windows 3.x, and the ability (finally) to read PC disks.
Networking: generally NetWare.
Me: late junior high and high school.
3. Windows 95/98: better GUI, better multi-tasking, networking over TCP/IP.
Windows NT 3.x/4.x: looked like 3.x/95, but totally different control panel and security model.
Mac OS X: better GUI, better multi-tasking, networking over TCP/IP.
Me: university.
4. Windows 2000: GUI, hardware and games support of Windows 98, but underlying behavior of Windows NT 4.x.
Mac OS X: Major move to laptops
Applications: Major commercial applications becoming skinnable ala WinAMP. Now users have widget sets that differ by application.
Me: entry-level professional career.
5. Windows XP: "Crayola" theme and task pane model.
Me: more experienced professional career.
It wasn't until I was at the university level that any specific platform skills gained would still have major use today. So what should schools be teaching NOW that students can use 10+ years from now?
(Full disclosure: I run Linux at home and work. My wife and I share the "main" computer and the laptop, and she gets along fine with it. There are some bumps every now and then when she really needs MS Word, but the laptop has XP dual-boot for that. But she is also constantly reminded how much nicer Linux is in the long run when a) we don't have to rebuild our systems every few months as I have had to do for the neighbors whose laptop got trashed by Windows worms on the wireless network, and b) I can do things like find a particular resume she needs, put it onscreen at home, and have her click print to get a copy, all while I'm at work talking to her over the phone.)
Perhaps this is simply because I am only familiar with software development and there is the same spectrum width in other professions as well but I somehow doubt it. I suspect, however, that software development is actually a very very hard process that only a small number of people truly have the mental discipline for.
I used to think the same thing. Then I went to graduate school for engineering and learned otherwise.
Software development is not very very hard. It is certainly not harder than designing a chemical plant, building, engine, material, etc. The truth is that the wide range in skills is present in all of the disciplines.
ABET-certified engineering schools graduate people who are not yet fit for the job of engineering, but then they must spend years working under people who ARE fit and take batteries of tests and worthwhile experience before they become the next generation's mentors. Software development has no such process.
The solution is to divide "programming" into three disciplines (as some schools are doing). Computer science remains the theoretical mathematical discipline for information theory. Information systems / MIS / BCIS / whatever is the broad computer applications discipline that we now call "IT". Software engineering is an ABET-certified path that people writing mission-critical software must undergo.
Sounds like Lisp to me.... It's a mystery to me why anyone would voluntarily program in a language that makes the things that should be easy difficult, and makes things like segfaults, which should be pretty darn hard to do, easy enough to accomplish by accident. Yet so many people do it.
I've been converting to Lisp since last January, and a few weeks ago I had a sore temptation to give up and spend more time on C++. Yes, I LOVE Lisp macros, CLOS is pretty powerful, and closures, and in general the "completeness" of the spec is astounding. HOWEVER:
1) The packaging blows. The CL's have settled on ASDF, which requires two files in addition the the source (the.asd and the.lisp with the defpackage form) that must be kept in sync with the source too. I would much rather have "(import my.lisp.packagename)" and have it Just Work.
2) Like Java, Lisp is both a language and a VM. In this case, multiple VMs that are all extended in incompatible ways to provide the functions that we need that aren't in the HyperSpec. The current OSS leader SBCL has rendered defconstant absolutely useless in flat violation of the accepted practice. A couple months ago I got CMUCL to segfault on an invalid pure-Lisp form. GCL doesn't yet support CLOS. I haven't yet bothered with CLISP, but I'm sure my code will expose other issues.
3) Also like Java, Lisp is too far away from the underlying OS. Case in point: pathnames. My first project in Lisp was to iterate my MP3s and call stat() to get their size. Imagine my surprise when I discovered that it was possible for (directory #P"foo") to return a pathname whose (namestring) could not be passed to (unix:unix-stat) (this is CMUCL). CMUCL had taken the OS-specific filename and munged it to a Lisp filename that was at that point useless to me. So I had to write my own pathname that would actually work on Unix just so that I could get file sizes without having to open files.
4) Performance really does matter. I've got Lisp code whose purpose is to read 30-100MB of floats, do some trivial manipulation, and write a few KB of output. The first version of the code took 5 minutes. After several DAYS of testing -- and learning that CMUCL has no decent profiler -- I finally figured out that the bottleneck was parsing floats. I dug into c.l.l and saw some code to improve parsing: CMUCL already had implemented that. I found two different libraries for parsing numbers, each improved performance significantly. I'm now down to about 1MB/second of processing speed. ON A 2.4GHZ PROCESSOR. My next step is to use UFFI to wrap strtod() and see if that makes things any faster.
I'm staying with Lisp through another round. Maybe another year will give me the skillz to make Lisp on par with Java and then within 1.5x of C. I like the VM, I like the macros, I like the language and syntax. I may even volunteer to help with maintaining a CL and REALLY dig deep. But these humps are ridiculous and I can only hope the next generation of Lisp hackers fixes them for the future.
SOME foresight is a good thing, but it's simply not possible to look into the future to figure out what you'll need much further than, hell, a year or two, I'd say.
Couldn't agree more. That's why I do most of my code on Linux, where the POSIX APIs will work everywhere (thanks to Cygwin) and are guaranteed to be portable into the future.
I got bit by MS multiple times already: when Win16 went to Win32, and Access 2.0 to Access 97, and VB6 to VB.NET, and VS97 to VS.NET, and Excel 97 to Excel XP . Now I've got code running from embedded 486 processors to 128-way SMP machines; that's a nice feeling of security.
First, I'd probably not write an OS-specific GUI database application when many frameworks already exist to make decent web-based database GUIs in minutes. See this film for how quickly some applications in Ruby, Python, and others can be brought up: http://oodt.jpl.nasa.gov/better-web-app.mov . (The main theme is that Java J2EE sucks for this purpose, and I agree.)
Second, supposing I DID do so, I would probably use Access on Windows and beat your speed claim by a factor of 2 at least. But if I could roll back time I could just as easily use Delphi, C++Builder, or PowerBuilder to do the same.
Now I have a challenge for YOU: get the VS editor to properly syntax highlight code in all of the following languages: Matlab, Perl, batch file (a.k.a. shell script), PHP, Python, Ruby, Lisp, C, C++, Java, and HTML, just for starters. Also make it recognize different indentation/whitespace rules for each language such that every source file looks exactly as you want it to.
Everyone has different priorities. I tried VS and it didn't work for me.
I groan everytime i see a pro-linux person complain "all you have to do is recompile the device drivers!"
I used to be one of those sort of, and I finally listened to the others saying how much modern Linux has changed and decided to move up from "compiling my own device drivers" to "just a GUI user". Surprisingly it has worked very well.
I installed Debian Etch on my laptop with KDE. Synaptic works at least as well as aptitude for package management. Abiword is excellent. CUPS had no problems working with my HP DeskJet over the network. Konqueror and Kmail have surprised me a lot in all the detailed improvements over Mozilla (better GPG support, much better filters in mail, better integration with CUPS, better handling of PDF, etc.). Even DVDs play easily with Kaffeine, and I DON'T have to mount/umount anymore. I plug in a USB anything and it generally works right out of the box: DVD writer, storage, ethernet, serial port, mice.
There are quirks, but they aren't bad. USB memory sticks need to be mounted as root -- the default policy isn't set for my non-root account to use it and I haven't fixed that yet. In order to get laptop battery stats I had to download a third-party OSS kernel module. Due to a weirdness in CMUCL I had to recompile the kernel, but that made installing the nVidia driver easier anyway (though I did have to delete the nvidiafb module). I had to install a third-party OSS driver for the wireless card, but that was easy too. So yeah, I still resort to some drivers but apart from wireless they were entirely optional.
All in all I'd say that there is essentially no reason anymore for ME to ever run anything but Debian now. Maybe in a few more years those other quirks will be fixed and you'll be able to use it too.
The best example of this blinkered point of view is Linus Torvalds refusing to allow a binary API for driver communication in the kernel.
I read the rest of your comment, and disagree. You are essentially arguing that the binary API is necessary so that closed-source drivers can be loaded in the kernel. However, closed-souce drivers CAN be loaded in the kernel without a stable binary API, as proven by the closed-source nVidia driver that is running on the machine I am typing this on.
There are excellent technical reasons to forbid a binary API, and by sticking to their guns Linus et al have managed to maintain rather high quality of the kernel. (Not that 2.6 hasn't had its problems, but it's still very good overall.)
The only real "business" reason to have a binary API is to allow users to run drivers for obsolete hardware that is neither supported by the vendor with their own closed-source drivers, nor have specs been released for a third-party driver to be developed. There are some unfortunate users left hanging in this situation, but it also shows users how important it is to pick their hardware: choose a strong stable company that will support your purchase, or choose a company willing to work with OSS from the start (like my wireless card from RaLink).
In the long run, this is a good practice that leads to better systems for end users.
So the JDK not being open source stopped you from using Java? Why?
Because if Sun had gone down the tubes entirely the JDK would be dead in the water. No more distributing the JDK (you DID notice that it had to come directly from Sun or one of its corporate licensees, didn't you?); no more new development on java.* and javax.*; no bugfixes for the existing code except by IBM, HP, etc. in their own branches and only on the platforms their branches were licensed for. That's what happens when a copyright holder goes under, no one else is allowed to pick up and continue.
It may look paranoid now, but 2000-2003 was a very rough time for Sun and "analysts" all over the tech market were thinking that maybe Sun's days were almost over.
Other languages have experienced similar problems navigating the terrain between corporate creation/ownership and popular adoption, the classic example being Smalltalk and others being Borland's "Turbo" extensions to x86 assembly language, C++, and Pascal. It would be foolish to commit your future to a language/platform that has only commercial vendors at the helm.
Thanks to GNU Classpath, Kaffe, Sabre VM, and many others, Java was very close to having a certified free implementation available. Now that Sun has decided to GPL their reference implementation, a certified free Java is almost done and all the existing Java code out there will still have a platform to run on in the future.
Win32 is an example of one subsystem in use on Windows and runs independantly of other subsystems like the *nix subsystem, OS/2, Win16, and Win64 subsystems to name a few examples. The subsystem OS architecture concept is not virtualization nor emulation, as each subsystem are true OSes acting independently with their own subsystem level kernels that sit on top of the NT architecture.
Are you sure about that? Assuming Windows XP still runs on i386/i486, those "subsystems" must be essentially the same as emulation. Not emulation of a chip, but emulation of an API ala Wine -- which as you know runs both Win16 and Win32 successfully under the same Linux kernel that runs both 32-bit and 64-bit Linux binaries.
So I will ask, give us even one example of something that Linux is capable of that Windows is not capable of doing.
It isn't very easy to pick a capability that Linux can do that Windows can't because frankly an OS is just an OS and so long as both support Turing-complete languages in theory both can do exactly the same things. However, Linux DOES make it much easier to do all of the following "out of the box" on any modern distro. With Windows, many of these capabilities are possible but certainly not out of the box and in many cases require expensive third-party closed-source software:
0. In a GUI, NOT get interrupted by some random popup dialog box while typing and have my next space/enter key cause who-knows-what to happen. This by itself is almost enough for me not to consider Windows ready for the desktop. Yes, there are registry settings that ALMOST fix the problem, but they still don't work 100% of the time.
1. Write programs in languages at all levels of abstraction that will run on any other Unix-like operating systems. Also, automate all routine aspects of the system via init scripts and cron.
2. Easily handle ALL of the standard network protocols as both client and server: SSH, SCP, FTP, SMTP, HTTP(S), IRC, IM, NFS, NTP,...
3. Easily show the user the status of the system in a transparent manner. CPU usage, processes list, mounted disks, available memory, logged in users, login history, disk quota,... Also, as a nice side effect, easy to back up and restore critical system data since it is all on disk and usually text files -- no registry to screw things up.
4. Easily handle multiple users in multiple security contexts. Need a root window? K -> System -> Root console. Need root access for specific tasks only? su or sudo.
5. Allows full debugging of rare corner cases so the system can still run. Example 1: Linux can run safely on a system with a bad RAM chip with a kernel boot parameter telling it to avoid using the affected memory area. Example 2: A bad library that kills X11 on startup CAN be identified and worked around. Example 3: A kernel module that borks the system can be easily fixed not to load at startup. These are pretty serious conditions that usually have no solution when encountered in the Windows world.
6. Allows MUCH easier mixing-and-matching of major components than Windows. Example: Most software runs the same in 2.4.x kernels and 2.6.x kernels on the SAME system; in Windows, this would be equivalent to being able to dual-boot Win2k and WinXP and have them use the same registry and have the exact same programs in the start menu.
I prioritized this list in the order that matters to me as a Linux desktop user. I need the computer to obey my commands, not interrupt a command halfway through. I need programming languages that work well and can also work on the supercomputing clusters I do research on. I need things to be automated easily, so that for instance my home computer can automatically update an external web page after its IP address changes so that I can always find home no matter where I am. I need full network connectivity including SSH and SCP to reach those supercomputers and also transfer files to friends anywh
I further realize that the kind of ethical, hard-working types we would actually want running the country are usually too busy running successful businesses (*cough* at republicans) and not sitting around on their inherited fortunes occassionally throwing money at the occasional charity to assuage their guilt at not earning their own bread (*cough* at democrats).
That's an interesting cough you've got there. Republicans are the hard workers and Democrats are the lazy fat cats? Sounds like you just stepped out of Bizarro world.
Also, what platform would sigsegv on accessing the memory at the address of a variable?
If foo pointed to say 0x0000ed45 and that address is well beyond your space, Linux will SIGSEGV. Here I have it as an int * rather than a char *.
#include
int main(int argc, char ** argv) {
int * foo = 0x0000ed45;
printf("Character at %p: ", &foo[0]);
fflush(stdout);
printf("%c\n", *(&foo[0]));
fflush(stdout);
}
$ gcc -o test test.c test.c: In function `main': test.c:5: warning: initialization makes pointer from integer without a cast $./test Character at 0xed45: Segmentation fault (core dumped)
This is probably not the thing you do -- I think I may have misunderstood what you said. Generally it should always be ok to take the address of a variable, but it makes my uneasy to take as an address the data of a variable.
I think the problem has much more to do with medical availability law than ADA. Just as a hospital has to treat anyone in critical condition in the emergency room, your wife is providing a life-and-death service to the general public. I won't argue you down, I'm sure the lawyers did that already.
Seems to me that the next step would be to sue the deaf person's insurance for not covering the cost of the translator, or the local government agency responsible for psychological care for not providing coverage to pay for a translator. This would push the economic burden back out to the medical insurance providers where it belongs. If my surgery is complicated, it costs more than the average; if the deaf person's treatment requires a certified translator, it costs more.
Out of curiousity, why would you do if (sizeof(foo) != sizeof(char *)... if (sizeof(char *) == 4*sizeof(char))... else...?
If it's char *foo, then sizeof(foo) == sizeof(char *). The question is thus does sizeof(char *) == sizeof(char foo[])? If they do (which will happen if a char * is the same length as 4 chars (generally 32 bits)), then I don't know any way to distinguish them offhand. foo[0] is always 'a', *foo is 'a', foo[3] is NUL, etc. I wouldn't take the address of a pointer and reference whatever is there because that might segfault on decent machines.
However, I do agree it's a reasonable question. There is a big difference between pointer and array that leads to things like memcpy vs memmove, strcpy vs strncpy, and also ties in with const.
Here's another question that has torn down quite a few interviewee's, tell me what principle does this demonstrate and why is it that it seems a large percentage of college grads don't understand the principle?
Presume one and only one of these header files is included in a program, write a routine that can determine which one was included (at runtime).
Since no one else answered:
int which_global_foo() {
if (sizeof(foo) != sizeof(char *))
{/* char foo[] was declared */
return 1;
}
else if (sizeof(char *) != 4*sizeof(char))
{/* char *foo was declared */
return 2;
}
else
{/* The answer can't be determined because char foo[] is the same length in memory as
* char * .
*
* This is probably a machine with 32-bit pointers.
*/
return 3;
} }
Of course, the check really isn't really at "run time" -- a good optimizing compiler should be able to eliminate entirely the non-reachable branches and might even inline the resulting function. But you get the idea.
As for the principle involved, one could go as deep as they want in talking about pointers, the implicit NUL terminator on C strings, the sizeof operator, or all of the above. The check function could also easily be turned into a precompiler check with a simple macro.
I will buck the trend and say: finish your 2-year, then get out and start living your life.
Others have said you'll change. I agree, but I also see clear evidence that you have thought things through far more than a typical 16-year-old. You are entirely correct that the pieces of paper one gets from a university don't count so much in the long run, and if you are already well-adjusted you won't benefit much from the "roundedness" of the 4-year program.
Let me outline MY 4-year experience. I started university at 16 through a pre-college program that put junior and senior high schoolers in a dorm on a 4-year state college. I did very well in that environment for 2 years, and made some friends that are still my closest friends in life though most of us live far away from each other now. After that, I bounced around several schools in engineering before I finally switched majors and finished a CS degree. All told, my 4 year experience was 7 years long, I was broke all the time, and despite the dot-com I had too much tied down in student loans to even consider taking a decent job to stabilize myself before graduating. All my personal relationships sufferred through those years as my life was this grinding process of taking courses that frankly did not interest me (engineering: pumps and compressors) or challenge me (CS). I was co-oping as much as possible just to be able to afford auto insurance, gas, and food.
Four years later I met my wife. She had ZERO college experience, but already fully owned land and cars and had travelled quite a bit, all on $6-$13/hr jobs over the years. And she is two years younger than me. She met me while I was making $65,000 / year and was floored at how much debt I had and how little financial stability was there. It took about six years from college graduation to decent financial stability for me.
Three years ago a passion ignited in me to combine the CS and engineering and start a career in molecular modeling. With my wife's support, we first moved to a state with several good engineering schools, then I worked full-time for one year to establish residency, then a year of full-time past-bac coursework to get into the graduate engineering program, and in two more years I'll have a Masters in engineering. This time around it has been MUCH easier to do, even as my homework is much more difficult. The difference is that I already know who I am and what I want, so I spend no time on the well-roundedness part, and I had the chance to prepare for two years before taking any classes, two years that still saw us living our lives without that everything-is-on-hold feeling (mostly).
I would suggest for you: Finish your 2 year and enjoy the immense savings you'll have over your peers' 4-year tuitions. Then spend some time out in the real world, gain some experience, and discover those things that matter to you. Drink a bit if you want. Dance. Travel. Save a bit. Avoid drugs though -- a conviction of possession will make future education VERY expensive.
If you find that you're kind of sinking financially, head to a 4-year, be broke for 1 year, then begin co-oping and eventually graduate.
If you find that you're pretty happy and successful without the 4-year, run with that. Networking through friends you make on the job will more than make up for the 4-year degree. (They don't tell you that in school obviously.) Except for seriously-bad economic downturns ala dot-bomb, you will be able to get jobs with an associates, some certs, and lots of friends and a solid work history.
Some avenues WILL be closed for you without a 4-year degree, but if you're OK with that don't worry about it. You generally won't be able to get in with a huge software corporation like IBM, Sun, HP, Microsoft, etc. You won't be able to work in some project domains (like nanotechnology, gene sequencing, biometrics) unless you do it yourself through F/OSS. Also, you will "miss out" on some of the social aspects of 4-year, but to be honest only people wit
You may pay $7 to the hosting provider, but I'm sure you pay yourself quite a lot more in hours.
$1000/month total business cost means $100 per month ISP + 30 hours @ $30 hour per month. That's only about 8-10 hours per week, or 1 full-time day, for the maintainer of the site.
Assuming even the bandwidth is still only $100 a month, can you set up a site that will handle 1 million visitors per hour and only spend 1 day a week maintaining it?
They're mad because their servers couldn't stand against traffic?
If you had a site designed for quick service to 1000 visitors/day that cost perhaps $1000/month, and it ran fine for 10 years, would you be a little pissed when it suddenly got 1,000,000 visitors every hour and fell over?
What if Slashdot, Digg, Furl, Reddit, Clipmarks, and a few others decided between themselves that they would always refer to your site every other day such that you never get it back online? That is in essence what uTube.com is suffering: an eternal Slashdot effect.
If uTube.com put up a page that says "Fuck YouTube.com!", how long do you think until Google had a lawyer send a C&D?
If your town lacks zoning laws, and your next-door neighbor puts a casino in their backyard, do you think you'll have legal recourse against them for the noise it generates every night? (Answer: yes.)
The pragmatic thing to do here is to register a new domain for Universal Tube (abandoning the name that has served well for ten years), directing traffic to either youtube.com or the new domain, and then getting Google to shell out some $$$ for the costs of the change. Youtube.com should have known when they registered their domain that lots of people might mistype the name and knock out their Internet neighbor, so they bear some responsibility in fixing the situation now that that is indeed what happened.
Plus the fact that the entire option "Set Program Access and Defaults" was a result of the anti-trust suit. Microsoft wouldn't let any other programs be the default browser except that a court forced them to. Now they imply that they cared about the end-users all along.
Given the technical capability and the dedication, a PhD with certain sales/marketing knowledge could take off quickly.
I've taken classes from PhD's who had outside businesses in their field. Bar none, they were assholes who routinely violated university ethics to get ahead.
I believe it really does boil down a fundamental question once all of that has been stripped away: do we believe that a person has a right to the income they've earned?
Income earned by exchanging time and skill is certainly deserved. Income accumulated through financial mechanisms that require no time or skill on the part of the recipient is debatable. The latter category is even termed "unearned income" by the IRS.
If I worked 60 hrs/week for 50 years, accumulated $1 million after taxes, and put all that money into a foundation that had its own staff accountant and lawyer, the original million would grow from interest indefinitely, pay the salaries of its management staff, and still produce a tidy annual income for one lucky person. That person would be able to do nothing the rest of their lives and still the foundation would grow and provide even larger incomes for more of their descendants. After two generations it could a dozen people living $100,000 per year lives. Given that those lucky beneficiaries are living in flat violation to the American work ethic, when is it OK to say enough?
Now let's add two twists.
First, suppose I accumulated that $1 million a hundred fifty years ago using slave labor. The principle is now criminal money and by law can be confiscated to benefit the victims. What of the interest? By now, the criminal money has accumulated many times the original investment; should the proceeds of those investments also be confiscated?
Now suppose that, in addition, I was far from alone in doing this, but rather hundreds of entrepreneurs made their $1 million and now tens of thousands of descendants are living work-free lives. If the principle was all gained illegally, what do we do with it now?
This BTW is what really happened. Yes, plenty of "rich" people worked hard to retire well and pass on modest inheritances to their descendants. But the much wealthier ruling class are the inheritors of illegally obtained fortunes. They will get accepted into Ivy League schools despite crappy SAT scores; they will have access to free multi-million-dollar loans to start businesses and rescue failed ventures; they will have access to politics as a viable career option.
It's all very well to talk about redistributing income "fairly" but it's all ultimately done at the point of a gun.
Oh, you're a Libertarian. Nevermind then. We live in a perfect meritocracy where the current economic situation does in fact absolutely reflect the ethical Good. Carry on then.
In the Torah, it was dictated that wealth would be redistributed every 50 years.
Remarkably prescient, that.
The Year of Jubilee was never actually observed in history. Nice idea, but when the time came to celebrate the bounty of the LORD, the Israelites decided that they wanted to keep their toys where they were.
These students, when they graduate and get real jobs, will have a >95% chance of using Windows in their job. What sense does it make to train them on a platform they have a 20:1 chance of never encountering?
The problem is that no matter what platform you train on, the one the students will use will be significantly different. Windows 3.1 was hugely different than Windows 95 -- much more different than Linux is from Windows XP. Windows Vista appears to be similarly different (at least in appearance) from Windows XP. I have seen five major shifts in desktop technology and people have adapted each time:
1. DOS: one application at a time, text-mode only, crappy batch language.
Mac: generally one application at a time, but with a GUI.
Almost no interoperability between them due to the Mac disk drive hardware.
Others: Commodore 64/128, Atari, Apple ][ c/e/gs, Xenix : People actually ran businesses on these.
Me: elementary school and early junior high.
2. Windows 3.x: multiple applications, crappy GUI.
Mac and PowerMac: much nicer GUI, similar multi-tasking as Windows 3.x, and the ability (finally) to read PC disks.
Networking: generally NetWare.
Me: late junior high and high school.
3. Windows 95/98: better GUI, better multi-tasking, networking over TCP/IP.
Windows NT 3.x/4.x: looked like 3.x/95, but totally different control panel and security model.
Mac OS X: better GUI, better multi-tasking, networking over TCP/IP.
Me: university.
4. Windows 2000: GUI, hardware and games support of Windows 98, but underlying behavior of Windows NT 4.x.
Mac OS X: Major move to laptops
Applications: Major commercial applications becoming skinnable ala WinAMP. Now users have widget sets that differ by application.
Me: entry-level professional career.
5. Windows XP: "Crayola" theme and task pane model.
Me: more experienced professional career.
It wasn't until I was at the university level that any specific platform skills gained would still have major use today. So what should schools be teaching NOW that students can use 10+ years from now?
(Full disclosure: I run Linux at home and work. My wife and I share the "main" computer and the laptop, and she gets along fine with it. There are some bumps every now and then when she really needs MS Word, but the laptop has XP dual-boot for that. But she is also constantly reminded how much nicer Linux is in the long run when a) we don't have to rebuild our systems every few months as I have had to do for the neighbors whose laptop got trashed by Windows worms on the wireless network, and b) I can do things like find a particular resume she needs, put it onscreen at home, and have her click print to get a copy, all while I'm at work talking to her over the phone.)
Perhaps this is simply because I am only familiar with software development and there is the same spectrum width in other professions as well but I somehow doubt it. I suspect, however, that software development is actually a very very hard process that only a small number of people truly have the mental discipline for.
I used to think the same thing. Then I went to graduate school for engineering and learned otherwise.
Software development is not very very hard. It is certainly not harder than designing a chemical plant, building, engine, material, etc. The truth is that the wide range in skills is present in all of the disciplines.
ABET-certified engineering schools graduate people who are not yet fit for the job of engineering, but then they must spend years working under people who ARE fit and take batteries of tests and worthwhile experience before they become the next generation's mentors. Software development has no such process.
The solution is to divide "programming" into three disciplines (as some schools are doing). Computer science remains the theoretical mathematical discipline for information theory. Information systems / MIS / BCIS / whatever is the broad computer applications discipline that we now call "IT". Software engineering is an ABET-certified path that people writing mission-critical software must undergo.
Sounds like Lisp to me.... It's a mystery to me why anyone would voluntarily program in a language that makes the things that should be easy difficult, and makes things like segfaults, which should be pretty darn hard to do, easy enough to accomplish by accident. Yet so many people do it.
.asd and the .lisp with the defpackage form) that must be kept in sync with the source too. I would much rather have "(import my.lisp.packagename)" and have it Just Work.
I've been converting to Lisp since last January, and a few weeks ago I had a sore temptation to give up and spend more time on C++. Yes, I LOVE Lisp macros, CLOS is pretty powerful, and closures, and in general the "completeness" of the spec is astounding. HOWEVER:
1) The packaging blows. The CL's have settled on ASDF, which requires two files in addition the the source (the
2) Like Java, Lisp is both a language and a VM. In this case, multiple VMs that are all extended in incompatible ways to provide the functions that we need that aren't in the HyperSpec. The current OSS leader SBCL has rendered defconstant absolutely useless in flat violation of the accepted practice. A couple months ago I got CMUCL to segfault on an invalid pure-Lisp form. GCL doesn't yet support CLOS. I haven't yet bothered with CLISP, but I'm sure my code will expose other issues.
3) Also like Java, Lisp is too far away from the underlying OS. Case in point: pathnames. My first project in Lisp was to iterate my MP3s and call stat() to get their size. Imagine my surprise when I discovered that it was possible for (directory #P"foo") to return a pathname whose (namestring) could not be passed to (unix:unix-stat) (this is CMUCL). CMUCL had taken the OS-specific filename and munged it to a Lisp filename that was at that point useless to me. So I had to write my own pathname that would actually work on Unix just so that I could get file sizes without having to open files.
4) Performance really does matter. I've got Lisp code whose purpose is to read 30-100MB of floats, do some trivial manipulation, and write a few KB of output. The first version of the code took 5 minutes. After several DAYS of testing -- and learning that CMUCL has no decent profiler -- I finally figured out that the bottleneck was parsing floats. I dug into c.l.l and saw some code to improve parsing: CMUCL already had implemented that. I found two different libraries for parsing numbers, each improved performance significantly. I'm now down to about 1MB/second of processing speed. ON A 2.4GHZ PROCESSOR. My next step is to use UFFI to wrap strtod() and see if that makes things any faster.
I'm staying with Lisp through another round. Maybe another year will give me the skillz to make Lisp on par with Java and then within 1.5x of C. I like the VM, I like the macros, I like the language and syntax. I may even volunteer to help with maintaining a CL and REALLY dig deep. But these humps are ridiculous and I can only hope the next generation of Lisp hackers fixes them for the future.
SOME foresight is a good thing, but it's simply not possible to look into the future to figure out what you'll need much further than, hell, a year or two, I'd say.
Couldn't agree more. That's why I do most of my code on Linux, where the POSIX APIs will work everywhere (thanks to Cygwin) and are guaranteed to be portable into the future.
I got bit by MS multiple times already: when Win16 went to Win32, and Access 2.0 to Access 97, and VB6 to VB.NET, and VS97 to VS.NET, and Excel 97 to Excel XP . Now I've got code running from embedded 486 processors to 128-way SMP machines; that's a nice feeling of security.
First, I'd probably not write an OS-specific GUI database application when many frameworks already exist to make decent web-based database GUIs in minutes. See this film for how quickly some applications in Ruby, Python, and others can be brought up: http://oodt.jpl.nasa.gov/better-web-app.mov . (The main theme is that Java J2EE sucks for this purpose, and I agree.)
Second, supposing I DID do so, I would probably use Access on Windows and beat your speed claim by a factor of 2 at least. But if I could roll back time I could just as easily use Delphi, C++Builder, or PowerBuilder to do the same.
Now I have a challenge for YOU: get the VS editor to properly syntax highlight code in all of the following languages: Matlab, Perl, batch file (a.k.a. shell script), PHP, Python, Ruby, Lisp, C, C++, Java, and HTML, just for starters. Also make it recognize different indentation/whitespace rules for each language such that every source file looks exactly as you want it to.
Everyone has different priorities. I tried VS and it didn't work for me.
I groan everytime i see a pro-linux person complain "all you have to do is recompile the device drivers!"
I used to be one of those sort of, and I finally listened to the others saying how much modern Linux has changed and decided to move up from "compiling my own device drivers" to "just a GUI user". Surprisingly it has worked very well.
I installed Debian Etch on my laptop with KDE. Synaptic works at least as well as aptitude for package management. Abiword is excellent. CUPS had no problems working with my HP DeskJet over the network. Konqueror and Kmail have surprised me a lot in all the detailed improvements over Mozilla (better GPG support, much better filters in mail, better integration with CUPS, better handling of PDF, etc.). Even DVDs play easily with Kaffeine, and I DON'T have to mount/umount anymore. I plug in a USB anything and it generally works right out of the box: DVD writer, storage, ethernet, serial port, mice.
There are quirks, but they aren't bad. USB memory sticks need to be mounted as root -- the default policy isn't set for my non-root account to use it and I haven't fixed that yet. In order to get laptop battery stats I had to download a third-party OSS kernel module. Due to a weirdness in CMUCL I had to recompile the kernel, but that made installing the nVidia driver easier anyway (though I did have to delete the nvidiafb module). I had to install a third-party OSS driver for the wireless card, but that was easy too. So yeah, I still resort to some drivers but apart from wireless they were entirely optional.
All in all I'd say that there is essentially no reason anymore for ME to ever run anything but Debian now. Maybe in a few more years those other quirks will be fixed and you'll be able to use it too.
The best example of this blinkered point of view is Linus Torvalds refusing to allow a binary API for driver communication in the kernel.
I read the rest of your comment, and disagree. You are essentially arguing that the binary API is necessary so that closed-source drivers can be loaded in the kernel. However, closed-souce drivers CAN be loaded in the kernel without a stable binary API, as proven by the closed-source nVidia driver that is running on the machine I am typing this on.
There are excellent technical reasons to forbid a binary API, and by sticking to their guns Linus et al have managed to maintain rather high quality of the kernel. (Not that 2.6 hasn't had its problems, but it's still very good overall.)
The only real "business" reason to have a binary API is to allow users to run drivers for obsolete hardware that is neither supported by the vendor with their own closed-source drivers, nor have specs been released for a third-party driver to be developed. There are some unfortunate users left hanging in this situation, but it also shows users how important it is to pick their hardware: choose a strong stable company that will support your purchase, or choose a company willing to work with OSS from the start (like my wireless card from RaLink).
In the long run, this is a good practice that leads to better systems for end users.
When did they change that?
So the JDK not being open source stopped you from using Java? Why?
Because if Sun had gone down the tubes entirely the JDK would be dead in the water. No more distributing the JDK (you DID notice that it had to come directly from Sun or one of its corporate licensees, didn't you?); no more new development on java.* and javax.*; no bugfixes for the existing code except by IBM, HP, etc. in their own branches and only on the platforms their branches were licensed for. That's what happens when a copyright holder goes under, no one else is allowed to pick up and continue.
It may look paranoid now, but 2000-2003 was a very rough time for Sun and "analysts" all over the tech market were thinking that maybe Sun's days were almost over.
Other languages have experienced similar problems navigating the terrain between corporate creation/ownership and popular adoption, the classic example being Smalltalk and others being Borland's "Turbo" extensions to x86 assembly language, C++, and Pascal. It would be foolish to commit your future to a language/platform that has only commercial vendors at the helm.
Thanks to GNU Classpath, Kaffe, Sabre VM, and many others, Java was very close to having a certified free implementation available. Now that Sun has decided to GPL their reference implementation, a certified free Java is almost done and all the existing Java code out there will still have a platform to run on in the future.
I stand corrected. It does seem to work now, but I'm not sure why it didn't work before.
Score +1 for Windows retaining a useful feature, -1 for it not working all the time.
Win32 is an example of one subsystem in use on Windows and runs independantly of other subsystems like the *nix subsystem, OS/2, Win16, and Win64 subsystems to name a few examples. The subsystem OS architecture concept is not virtualization nor emulation, as each subsystem are true OSes acting independently with their own subsystem level kernels that sit on top of the NT architecture.
...
... Also, as a nice side effect, easy to back up and restore critical system data since it is all on disk and usually text files -- no registry to screw things up.
.
Are you sure about that? Assuming Windows XP still runs on i386/i486, those "subsystems" must be essentially the same as emulation. Not emulation of a chip, but emulation of an API ala Wine -- which as you know runs both Win16 and Win32 successfully under the same Linux kernel that runs both 32-bit and 64-bit Linux binaries.
So I will ask, give us even one example of something that Linux is capable of that Windows is not capable of doing.
It isn't very easy to pick a capability that Linux can do that Windows can't because frankly an OS is just an OS and so long as both support Turing-complete languages in theory both can do exactly the same things. However, Linux DOES make it much easier to do all of the following "out of the box" on any modern distro. With Windows, many of these capabilities are possible but certainly not out of the box and in many cases require expensive third-party closed-source
software:
0. In a GUI, NOT get interrupted by some random popup dialog box while typing and have my next space/enter key cause who-knows-what to happen. This by itself is almost enough for me not to consider Windows ready for the desktop. Yes, there are registry settings that ALMOST fix the problem, but they still don't work 100% of the time.
1. Write programs in languages at all levels of abstraction that will run on any other Unix-like operating systems. Also, automate all routine aspects of the system via init scripts and cron.
2. Easily handle ALL of the standard network protocols as both client and server: SSH, SCP, FTP, SMTP, HTTP(S), IRC, IM, NFS, NTP,
3. Easily show the user the status of the system in a transparent manner. CPU usage, processes list, mounted disks, available memory, logged in users, login history, disk quota,
4. Easily handle multiple users in multiple security contexts. Need a root window? K -> System -> Root console. Need root access for specific tasks only? su or sudo
5. Allows full debugging of rare corner cases so the system can still run. Example 1: Linux can run safely on a system with a bad RAM chip with a kernel boot parameter telling it to avoid using the affected memory area. Example 2: A bad library that kills X11 on startup CAN be identified and worked around. Example 3: A kernel module that borks the system can be easily fixed not to load at startup. These are pretty serious conditions that usually have no solution when encountered in the Windows world.
6. Allows MUCH easier mixing-and-matching of major components than Windows. Example: Most software runs the same in 2.4.x kernels and 2.6.x kernels on the SAME system; in Windows, this would be equivalent to being able to dual-boot Win2k and WinXP and have them use the same registry and have the exact same programs in the start menu.
I prioritized this list in the order that matters to me as a Linux desktop user. I need the computer to obey my commands, not interrupt a command halfway through. I need programming languages that work well and can also work on the supercomputing clusters I do research on. I need things to be automated easily, so that for instance my home computer can automatically update an external web page after its IP address changes so that I can always find home no matter where I am. I need full network connectivity including SSH and SCP to reach those supercomputers and also transfer files to friends anywh
I further realize that the kind of ethical, hard-working types we would actually want running the country are usually too busy running successful businesses (*cough* at republicans) and not sitting around on their inherited fortunes occassionally throwing money at the occasional charity to assuage their guilt at not earning their own bread (*cough* at democrats).
That's an interesting cough you've got there. Republicans are the hard workers and Democrats are the lazy fat cats? Sounds like you just stepped out of Bizarro world.
Also, what platform would sigsegv on accessing the memory at the address of a variable?
./test
If foo pointed to say 0x0000ed45 and that address is well beyond your space, Linux will SIGSEGV. Here I have it as an int * rather than a char *.
#include
int main(int argc, char ** argv) {
int * foo = 0x0000ed45;
printf("Character at %p: ", &foo[0]);
fflush(stdout);
printf("%c\n", *(&foo[0]));
fflush(stdout);
}
$ gcc -o test test.c
test.c: In function `main':
test.c:5: warning: initialization makes pointer from integer without a cast
$
Character at 0xed45: Segmentation fault (core dumped)
This is probably not the thing you do -- I think I may have misunderstood what you said. Generally it should always be ok to take the address of a variable, but it makes my uneasy to take as an address the data of a variable.
I think the problem has much more to do with medical availability law than ADA. Just as a hospital has to treat anyone in critical condition in the emergency room, your wife is providing a life-and-death service to the general public. I won't argue you down, I'm sure the lawyers did that already.
Seems to me that the next step would be to sue the deaf person's insurance for not covering the cost of the translator, or the local government agency responsible for psychological care for not providing coverage to pay for a translator. This would push the economic burden back out to the medical insurance providers where it belongs. If my surgery is complicated, it costs more than the average; if the deaf person's treatment requires a certified translator, it costs more.
Good luck with things anyway.
Out of curiousity, why would you do if (sizeof(foo) != sizeof(char *) ... if (sizeof(char *) == 4*sizeof(char)) ... else ...?
If it's char *foo, then sizeof(foo) == sizeof(char *). The question is thus does sizeof(char *) == sizeof(char foo[])? If they do (which will happen if a char * is the same length as 4 chars (generally 32 bits)), then I don't know any way to distinguish them offhand. foo[0] is always 'a', *foo is 'a', foo[3] is NUL, etc. I wouldn't take the address of a pointer and reference whatever is there because that might segfault on decent machines.
However, I do agree it's a reasonable question. There is a big difference between pointer and array that leads to things like memcpy vs memmove, strcpy vs strncpy, and also ties in with const.
Here's another question that has torn down quite a few interviewee's, tell me what principle does this demonstrate and why is it that it seems a large percentage of college grads don't understand the principle?
/* char foo[] was declared */ /* char *foo was declared */ /* The answer can't be determined because char foo[] is the same length in memory as
header_0.h: char *foo = "abc";
header_1.h: char foo[] = "abc";
Presume one and only one of these header files is included in a program, write a routine that can determine which one was included (at runtime).
Since no one else answered:
int which_global_foo() {
if (sizeof(foo) != sizeof(char *))
{
return 1;
}
else if (sizeof(char *) != 4*sizeof(char))
{
return 2;
}
else
{
* char * .
*
* This is probably a machine with 32-bit pointers.
*/
return 3;
}
}
Of course, the check really isn't really at "run time" -- a good optimizing compiler should be able to eliminate entirely the non-reachable branches and might even inline the resulting function. But you get the idea.
As for the principle involved, one could go as deep as they want in talking about pointers, the implicit NUL terminator on C strings, the sizeof operator, or all of the above. The check function could also easily be turned into a precompiler check with a simple macro.
I will buck the trend and say: finish your 2-year, then get out and start living your life.
Others have said you'll change. I agree, but I also see clear evidence that you have thought things through far more than a typical 16-year-old. You are entirely correct that the pieces of paper one gets from a university don't count so much in the long run, and if you are already well-adjusted you won't benefit much from the "roundedness" of the 4-year program.
Let me outline MY 4-year experience. I started university at 16 through a pre-college program that put junior and senior high schoolers in a dorm on a 4-year state college. I did very well in that environment for 2 years, and made some friends that are still my closest friends in life though most of us live far away from each other now. After that, I bounced around several schools in engineering before I finally switched majors and finished a CS degree. All told, my 4 year experience was 7 years long, I was broke all the time, and despite the dot-com I had too much tied down in student loans to even consider taking a decent job to stabilize myself before graduating. All my personal relationships sufferred through those years as my life was this grinding process of taking courses that frankly did not interest me (engineering: pumps and compressors) or challenge me (CS). I was co-oping as much as possible just to be able to afford auto insurance, gas, and food.
Four years later I met my wife. She had ZERO college experience, but already fully owned land and cars and had travelled quite a bit, all on $6-$13/hr jobs over the years. And she is two years younger than me. She met me while I was making $65,000 / year and was floored at how much debt I had and how little financial stability was there. It took about six years from college graduation to decent financial stability for me.
Three years ago a passion ignited in me to combine the CS and engineering and start a career in molecular modeling. With my wife's support, we first moved to a state with several good engineering schools, then I worked full-time for one year to establish residency, then a year of full-time past-bac coursework to get into the graduate engineering program, and in two more years I'll have a Masters in engineering. This time around it has been MUCH easier to do, even as my homework is much more difficult. The difference is that I already know who I am and what I want, so I spend no time on the well-roundedness part, and I had the chance to prepare for two years before taking any classes, two years that still saw us living our lives without that everything-is-on-hold feeling (mostly).
I would suggest for you: Finish your 2 year and enjoy the immense savings you'll have over your peers' 4-year tuitions. Then spend some time out in the real world, gain some experience, and discover those things that matter to you. Drink a bit if you want. Dance. Travel. Save a bit. Avoid drugs though -- a conviction of possession will make future education VERY expensive.
If you find that you're kind of sinking financially, head to a 4-year, be broke for 1 year, then begin co-oping and eventually graduate.
If you find that you're pretty happy and successful without the 4-year, run with that. Networking through friends you make on the job will more than make up for the 4-year degree. (They don't tell you that in school obviously.) Except for seriously-bad economic downturns ala dot-bomb, you will be able to get jobs with an associates, some certs, and lots of friends and a solid work history.
Some avenues WILL be closed for you without a 4-year degree, but if you're OK with that don't worry about it. You generally won't be able to get in with a huge software corporation like IBM, Sun, HP, Microsoft, etc. You won't be able to work in some project domains (like nanotechnology, gene sequencing, biometrics) unless you do it yourself through F/OSS. Also, you will "miss out" on some of the social aspects of 4-year, but to be honest only people wit
You may pay $7 to the hosting provider, but I'm sure you pay yourself quite a lot more in hours.
$1000/month total business cost means $100 per month ISP + 30 hours @ $30 hour per month. That's only about 8-10 hours per week, or 1 full-time day, for the maintainer of the site.
Assuming even the bandwidth is still only $100 a month, can you set up a site that will handle 1 million visitors per hour and only spend 1 day a week maintaining it?
They're mad because their servers couldn't stand against traffic?
If you had a site designed for quick service to 1000 visitors/day that cost perhaps $1000/month, and it ran fine for 10 years, would you be a little pissed when it suddenly got 1,000,000 visitors every hour and fell over?
What if Slashdot, Digg, Furl, Reddit, Clipmarks, and a few others decided between themselves that they would always refer to your site every other day such that you never get it back online? That is in essence what uTube.com is suffering: an eternal Slashdot effect.
If uTube.com put up a page that says "Fuck YouTube.com!", how long do you think until Google had a lawyer send a C&D?
If your town lacks zoning laws, and your next-door neighbor puts a casino in their backyard, do you think you'll have legal recourse against them for the noise it generates every night? (Answer: yes.)
The pragmatic thing to do here is to register a new domain for Universal Tube (abandoning the name that has served well for ten years), directing traffic to either youtube.com or the new domain, and then getting Google to shell out some $$$ for the costs of the change. Youtube.com should have known when they registered their domain that lots of people might mistype the name and knock out their Internet neighbor, so they bear some responsibility in fixing the situation now that that is indeed what happened.
Plus the fact that the entire option "Set Program Access and Defaults" was a result of the anti-trust suit. Microsoft wouldn't let any other programs be the default browser except that a court forced them to. Now they imply that they cared about the end-users all along.
Substitute "marxists" for "libertarians" and you are entirely correct.
Precisely.
Should they demand that the employer purchase the code signing certificate as part of the accommodation for the disability?
That would be an excellent idea. Another is simply not to upgrade to Vista.
Given the technical capability and the dedication, a PhD with certain sales/marketing knowledge could take off quickly.
I've taken classes from PhD's who had outside businesses in their field. Bar none, they were assholes who routinely violated university ethics to get ahead.