But you're missing something.. We simultaneously discovered algorithms and electronic switching circuits (in different centuries even). But the practical application of complex repetitive algorithms ultimately was contingent on the advancement of the physics model. From gears/belts to electro-magnetic solinoids to diode-resistor circuits to field-effect transistors to MASSIVELY parallel transister farms - and possibly to quantum state management.
As each technical hurdle of physics was achieved, we were able to explore ever greater algorithms, until we could write algorithms OF algorithms (ruby-on-rails molds most all aspects of CIS from english constructs into organized hyper-complex code - something Lisp/prolog hasn't seemed to practically achieve). Map-reduce structures can pass tertiary abstract algorithms to both data and algorithm streams.
The order of complexity (allowed by the increasing algorithmic processing capacity adapted to particular classes of algorithms) is slowly allowing us to approach practical computational autonomy. Meaning a proto-brain.
Fundamentally I agree with you that you don't model the software of MS word with differential equations on the circuit board - though I believe you could. BUT both processes are / were ultimately necessary.
I think you're over stating things here.. In comparison, look at how our evil over-lords have enslaved us by learning about gravity. We really can't risk letting them learn about the next level - sabots to the factory machines I tell you!!
Plus I roll my eyes whenever I hear people talk about free will. It is a completely irrelevant question - it can have zero possible impact on your day to day activities (or at most an equivalent impact as learning that it's raining outside). Even a resultant decision to commit suicide is more attributable to the emotional stability of the person than anything else. Consider for a moment why you don't go around raping every orifice that moves. I'm pretty sure God has nothing to do with that decision. It's the same reason why Dogs don't do it - because they learn (often the hard way) that it's not always prudent.
Can't tell if you were joking or not. So I'll play along for fun. "This means either you believe you exist, and if that is the case then you have to solve the mystery of your own existence."
There is no intrinsic requirement to find one's origins.. We're not all salmon.:)
"Or you don't believe you exist, and consciousness and free will are fake illusions."
Some random definition which seems to agree with your argument: consciousnsess: aware of one's own existence, sensations, thoughts, surroundings, etc
Thus consciousness implies existence by definition. But the reverse is not intrinsically true. You are either existent and conscious, non-existant and non-conscious, OR non-existant and falsely conscious.
I can describe to you a character that is fully aware of itself and it's surroundings.. But then I can tell you afterwards that it doesn't exist. The virtual construct is by all measurable means to you existent, except that it was a lie / fabrication (e.g. a play / cartoon / software program). But most importantly what DOES exist - the 'story' of the non-existent character is defined as fully conscious.
Thus illusion of consciousness is not an illusion to the character, but to the receiver of the fabricated story. HIS consciousness is real - only the projection of his existence has any 'fakeness' (exclusively in the mind of the story teller - unless and until they share the fakeness of the character to the audience).
Free will is also completely abstract and meaningless here as well. The fake character has no knowledge of this philosophical strife.. He acts consistently with his presumably consistent personality and life-struggle.. Making emotionally impactful, gratifiable, or regrettible decisions (or willfully avoids such decisions). Whether his story embraces the duality of his universe and the story-teller is fully within the control of the story teller (so long as the story teller controls the knowledge of the character's existence). Meaning, you as an audience member wouldn't debate with a friend whether their brother ACTUALLY graduated college or not - your knowledge of what this supposed brother did is completely outside of your knowledge .
If you learn the syntax inside and out, perl has some of the most concise verbs I've ever used. 90% of the perl scripts I've written were 1 liners (where a line can exceed 200 characters).
skype on linux is buggy and so so. I give it two chances to get better under MS management, slim and none. Thus as an avid promoter of thin-client linux boxes, I'm not unlikely to want to risk investing in corporate multi-screen-sharing chat accounts, and or skype centric voip phones.
While not a death knell for say.. The one that hit me hard was visio. From $50 to $300+. Most of my co-workers who can 'justify' the added costs say it's crap these days anyway.
I'm sorry, but I'll have to reply later because my windows server says it's patch tuesday and I have to reboot. Oh wait, I'm on a 300 day uptime linux desktop - whew.
I agree that OS is generally not a critical factor in the ability or lack thereof to scale. But I would argue that windows is closer to Oracle in needing fine-tuning to properly be used. Linux stacks, in my experience are closer - out of the box - to a final configuration, especially since it's free to re-distribute, you can download a configuration fine-tailored to your specific needs.
I would also argue that linux has a much smaller foot-print that lends itself better to scaled shared OS hardware usage. Targetted boots (or specialized user-mode-linux style VMs) can have less than 2 meg of overhead for each virtual node. Not that windows CAN'T do this, but you only have one company that's legally allowed to try to offer it as a solution.
Most of the time, this doesn't make any difference, so in general I agree with you.
Considering that amazon and rackspace lets you 'lease' a VM for like $30 / mo, I'm not aware of web-services much less than $10 or $15 / mo. By going 2x the lowest possible price, you get a full rooted VM. You can put your entire software stack on there. For slightly more you can add things you get important things like load-balancing, fault-tolerance, backed ups, remotely accessibility anywhere in the world, reasonably security (pre-shared keys). It can leverage an international CDN for low ms response times. Takes advantage of unlimited (non-free) highly-redundant storage. You have the option of leasing web-services such as clustered data-stores, message-queues, email-services, credit-processing services (not at rock bottom rates, but still pretty competative given a micro-payment type model). If you want to go micro-service, google-apps is great - more importantly is more future proof. I'm sure in the past year since I last looked, there's a lot of competition in this space (linode is one that comes to mind).
If you're trying to solve a business need and it isn't based on cut-throat razor thin margins, then I don't see why you'd need to re-invent the wheel on every aspect of the software stack.
The single biggest reason to go cloud (IMO) is to avoid a slashdot effect. Bandwidth choke-points are gone. So long as your landing page is static / cacheable, and ideally in a CDN (rackspace/amazone provide it, I assume google-apps does as well), then you at least get people in the front door no matter what happens.
No matter how much infrastructure and BW you purchase, it won't be enough to meet your launch date's advertising draw (assuming you have paid advertising / viral-ware). And it's ungodly expensive to maintain that BW capacity 24/7 - especially prior to launch.
For dynamic data, yeah, there's no such thing as cloud-scale real-time computing. Ultimately it all comes down to in-RAM DB's and or sharding - both of which don't generally solve multi-million dollar problems very well (multi-billion dollar... sure). If you're lucky enough to have a business model that can fit in RAM or be geographically / lexographically partitioned, then count yourself lucky.
Everything else comes down to ingenuity of software/network/data design. But of course, that's all predicated around having a sound business model.
You probably don't like btrfs for boot - as this is probably too bleeding edge, but once solid, the advantage is high-degree of replication-factor for a small partition. Say you put 100Meg.. You can have it replicated 4 ways across 2 disks - basically similar to using mdadm with a R1 for the first 100Meg of each disk.. But without having to have a complex setup that's isolated from the rest of the system.
? Do you mean the RAID-5 write-hole? R5 wasn't available as an option as of Fedora core 14.:( But I'm certainly waiting for it - means I can finally get away from R10 costs / drive-count limitations.
Well, I doubt you can say 'no' overhead. COW fragments modified chains at 4K grains (of otherwise fully contiguous chunks with a single piece of meta-data (the starting disk-block+length). So if you have a large file that's random-access modified (like a DB), then it's read-performance will degrade overtime due to random seeks.. Though I bet it's better than qcow2 fragmentation since all data-block-references for a given file are contiguous in the "inode" record. Thankfully btrfs has defrag support so this can be mitigated, but for a 24/7 DB server that's not likely to be practical. Granted this is just one case, and I totally support the 'yum upgrade' then reboot/revert concept.:) Here's crossing my fingers.
Because LVM is not the panacea you seem to make it out to be, and mdadm that don't span the entire disk partitions are a pain (I've been using advanced features of both for 5 years, namely non-symmetric disks FORCED together with lots of LTC). zfs/btrfs have seamless volume-size/volume-distribution/volume-affinity management. Technically I can replicate many/most of it's features with LVM/mdadm/extX, but most operations say 'should backup' - not trivial when 55% of disks are already utilized.
I haven't done extensive testing of copy-on-write of btrfs v.s. LVM, but LVM cow is large-block oriented and thus painful for micro-writes of an underlying VM - I'm resorting to qemu's qcow2 on ext4 so I can get large-blocks with small COW, but it's still slow as a dog v.s. raw sparse-allocation. When I have time I'm going to play with btrfs's buffering/queuing of COW structures. I doubt it's any faster, but at least I don't have to suffer over-allocation (meaning it's free to allocate a partition in btrfs for a sparse VM, unlike w/ LVM).
Note, the ext4 gives me something that approaches raw LVM partitions for mysql INNODB data-blocks or VM images. (e.g. contiguous spans with little/no metadata random disk-accesses for multi-terabyte large files).
So I challenge the notion that ext2, netapp or bust. I've used just about all these configs.. iSCSI, aoe, dbrd, 3com, netapp, extX, XFS. It's just frustrating that the limitations of each of these toolchains don't seem to be mitigated by taking the best ideas from each approach. So right now, I'm cheering for btrfs, because it SEEMs like it could take the advantage of many capabilities (zfs just doesn't seem to have the performance, even though I love the RAID-Z concept - closer to netapp's WAFL in terms of RAID w/o consequences). The problem is that it's pointless to have a resizable partition if the least defined partition-size (root partition) NEEDS to be extX instead of btrfs.. So this lets my VM's boot with a more symmetric config.
If you're the It department of a fortune 500 company - you're expected to have a certain degree of fault-tolerance, as provided by full-validated documentation processes, isolated Q/A teams, employee rotation to prevent fraud, etc. Budget is never an issue - you buy SAS instead of SATA, you get netapp instead of 3ware cards, etc. The business isn't you, you're a smaller part of the business.
If you're a software contracting company - your margins are a little tighter.. You can say you need X amount of time/redundancy for good practices, but your competition can do it at 1/3rd the price (either through out-sourcing non-critical components or through consolidation of resources), then you don't have s much room for luxuries.
I've you're a startup, on VC-funding, and you're in a dry-spell, the making or breaking of a company has to do with making every resource as efficient/effective as possible. 'Documentation' and modularizing critical designs so they can be worked on in parallel is a luxury that is at odds. Here, the 3 man tech-team is most productive. Large enough to divide most tasks, small enough to communicate every aspect verbally - documented via issue-tracking.
I'm pretty sure that most developers are not employed by fortune 500 companies, but your mileage may vary. Hiring a new employee into each of these domains is radically different. And if, as I'd suspect, the majority of hires are into 3-man teams (even if that's only a department of a larger organization), then the issues I've outlined are certainly at play.
*eeeeh* wrong answer. If I was interviewing someone that was straight out of college - I'd ask what projects they've worked on - what languages - what are their viewed strengths of those languages. Walk me through how you've solved a problem.. I'm looking for how they did their research. Did they read a book (end to end), did they just google a single one-line answer, did they read through blogs (were they able to figure out appropriate sites to look at), did they compare and contrast? Did they write little micro-unit tests to prove/disprove what they'd researched. Have they ever tried to wire two languages together (batch/shell scripting to launch their larger app). Have they spent a lot of time learning their OS of choice? (Do they know ALL the power commands of their OS/editor). I don't care that they KNOW things, I care that they've determined that some problem in their life require that they learn something new.. And most importantly, I need to know that they have enough diverse almost-lost knowledge that they can quickly go to some reference place or places and re-learn something - hopefully not from scratch every time.
I don't care the breadth, but I've worked with genious's, mild genious's, hard-working average people, and been completely satisfied.. I've even worked with lesser intelligent tech people that worked very hard and were very concerned with verifying themselves - so I feel comfortable with them doing compartmentalized work.. But what I can't stand are people that throw their hands up and essentially have you micro-code their work for them. It reminds me of 'group projects' back in college where I had to do all the work.. There, it just meant grade-inflation.. But in a real work environments - it means they literally serve as net-negative utility. Not only am I ultimately doing their work for them, but I have to do it slower so they can comprehend each step. It's not their ability - it's their approach, and risk-aversion.. Just make something that functionally works, then ask (at a high level) if their general style (which they need to be able to verbally communicate) can be improved. And that's why seeing that you can accomplish things on your own is critical in employee selection. If you could get from A to B without having someone do it for you - then you can add utility to a firm. If you're going to go the MBA/networking route and use psychology to get people to do work that you take credit for, then step on their heads to get ahead, then you're going to stand out like a sore thumb in the tech world.
Easier said then done.. This assumes you have appropriate risk-isolation, that you've properly and fully documented your processes in an low-IQ documentation-level; it assumes you have high-talent mentors with lots of free time.
The reality is that Xeros research centers, google/MS research centers are relatively small, and certainly not large enough to encompas the entire graduating class of any given year. The reality is that companies, especially start-ups, live on a margin - likely already in the red. Highly talented people are not necessarily best tasked with documenting, making repeatable processes, nor are they apt at being mentors outright (personalities that do this well are rare). If you have a single company and a single network - can you really task a new-hire with managing the CISCO router? Nor do you likely have a 100% sandboxed duplicated environment?
Generally when you want to hire new developers, it's because your tight-nit core team is over-tasked and deadlines are slipping. It is often very difficult to grow this team in any fashion - even with very high end developers - I just rarely see it properly done with straight-out-of college types.
It's generally most seamless when you can give them a complete isolated project (say an infrustructure support tool) - or have them pair program with someone. But these aren't usually the immediate needs of a growing business.
I don't see a problem with this.. Consider the construction industry. You hire a guy to build your deck, you don't exactly want someone that's making it up as they go - you'd like to know they've accomplished similar projects in the past. It's fine if you hire someone with an apprentice - since the guy you're hiring is the one who's ultimately responsible.
Software development isn't exactly free-lance just yet - you still have a majority as direct employed, for better or worse. And even with free-lancing, you don't generally see a lot of sub-contracting to apprentices. But there's no reason why you shouldn't.. You're high priced hourly contract rate can be better managed by sub-delegating low-risk tasks.
As for fostering corporate loyalty - I've been with several firms (small ones even) that have internship programs - such interns almost never ultimately stay with the company, but this does serve the role you raise. But from my experience, this is an incredibly painful experience for the manager (for which I've severed on a number occasions). You really salivate when you come across people that have just leveraged open-source projects on their own time (possibly while they were studying in college, possibly as a second career). People that have appropriate work-ethics, strongly motivated, and not afraid to take on risks.
Perl is a bad example - it's called CPAN. SQL examples are trivial, just show the schema on a USB drive. github is 100% free, and awesome for entire open-source project-stacks. PHP shouldn't be too bad on a USB drive - or can easily run on a WAMP/LAMP stack on your laptop. As for hosted services, there's amazon/rackspace, and google-apps. Amazon/rack-space are dirt cheap, and google-apps are free for low-loads.
amazon/rackspace have zero restrictions on your application-stack (you get root/Administrator to the machine). google-apps assumes python/java, but if you know what you're doing, scripting/etc are detriments to dynamically scalable solutions anyway.
I'm sure there are tons of Xen/KVM based solutions to choose from, so I'm not sure what you're complaining about.
Your opinion v.s. mine I guess. One of Perl's mottos is to minimize surprise. Both perl and JS polymorphically convert from int to string and back. Don't believe me? x="5" y=x/2 y == 2.5
So JS 'smells' like it wants to do polymorphic base data-types.. But it fails miserably to be consistent. Numbers are more useful than strings (my opinion I guess), so if you've bothered to convert from a string-space to double/integer space, it makes little sense to squash it back to string-space. Now in perl, string space operations are generally explicit "$x", thus all the 'magic' tends towards converting into integer space.. Most other languages make it harder to convert into string space, so I can see why JS made the fateful decision - both JS and Perl are essentially string-centric languages, but without trivial string generators, the only convenient operator JS had was '+'. So basically if any rval is a string, the whole operation is overloaded to string conversion.
Really, I'm just lamenting the lack of optional data-types (scala, etc). In perl, we could say sub foo($$) { use int; return $_[0] + $_[1]; }
Not that this is beautiful code or anything, but the datatypes are coorseable as a compiler-flag is the point. Technically, JS is JIT'd these days, so function foo(x,y) { return Number(x) + Number(y); } is plenty fast - just reads funny (yes, I know the perl was nastier in comparison, but there are more elegant blocks of long-spanning functions where these sorts of auto-stringification can accidentally be introduced - namely function-returned-values).
""+" doesn't append _two numbers_, but it can append _number to string_ - which you can have in any language with operator overloading." function foo(x,y) { return x + y; } foo("5",6) == "56"
In every other language I've seen, the CORRECTly expected result is 11 or error. Perl, C++, etc. The point is that you can never trust your input if you are expecting numeric.
You must guard the inputs with explicit (and thus inefficient/unreadable casts). If you're using a 3rd party library, you'll be pulling you hair out trying to figure out what went wrong.
The language is full of such wtf's. While you can happily redefine most core operations (e.g. how jQuery fixes IE), you can't overload the + operator. Call my cynical, but I don't like languages that let you corrupt basic building blocks.
That being said, javascript is excellent at what it was designed for - and passable for what it's currently used for, but I fear for the future if it's the basis of future industrial strength applications.
One place I WOULD like to see it extended is DB's.. CouchDB has a very nice java-script based map-reduce framework - it leads to concise and expressive code (that's really NASTY if plsql, etc are used).
Basically javascript is excellent fragment-code. But HORRIBLE for modular libraries - having to write an entire library (like jquery) in a scoped wrapper then assigned to a mutable/corruptable symbol is sick. (Especially since library A will mutate library B without permission - hello 1970s!!)
Actually - I think you're being short-sighted about this. It isn't that people prefer it or not.. It's that there are billions to be made, forcing people to re-purchase their $10,000 DVD action-movie library in blue-ray.. Another billion in repurchases of blue-ray-3D. So we needn't worry about us being 'duped' into these purchases, we need to instead worry about exclusivity. You like revenge of the nerds, but you don't subscribe to netflicks.. Sorry, only available purchase for you (5 years from now) is to buy the Blue-ray + DVD + digital-copy + 3D edition that also couples 5 editions.. Bundle cost - a BARGAIN at $30. Considering this is like a $2 marginal value - the frustration and impulse purchase made an incremental profit of $28 by throwing tons of 'perceived value' at the otherwise non-interested customer.
For example, I wanted mega-mind - and figured I might want to put it on my android so my daughter can watch it in the car.. But, unlike the 5 other DVD's I purchased with this combo, the ONLY one available to me on discount day (the day the DVD is released and thus sells for $8 under retail) was the full on 3D + Blue-ray + DVD + digital-copy.. It was only like $4 more, but I felt a certain anger that I was being force to subsidize this.
Part of the reason I personally have a problem with 3D.. It's speculated that it's bad for adults eyes, and very bad for children's eyes. Further my wife happens to not be able to see 3D - so it's actually a detriment for family viewing overall. Personally, in the theater I enjoy the 3D experience - but I'm almost never there by myself, so overall, I worry about the overall leaching of the lower class through malicious bundling and marketing.
"I have taught Java for years, because many colleges think it is a good first language to learn. Only recently have I actually attempted to develop commercial quality applications in it. Frankly, Java sucks big green ones."
Opinion - as I would say the same for Ruby/php/perl. And I lothe non-portable languages. Java is really the best of what's available in my h. opinion.
"Generic types (with type-erasure) are a total hack" -agreed, but it solved a particular annoying problem of having maps of maps of maps and having no clue what the hell's inside. Generics gives good coding feedback - reduces errors.. Performance wise it is worse than not having them though.
", denying the running code valuable information." -incorrect. So long as you extend a class with a generic, you can query the generic's concrete type.. It's cludgy, and best delegated to discovery utility classes, but very very vaulable in producing dynamic code (such as for database abstraction layers).
" Abstract classes are only half-implemented, since you cannot have abstract static methods (e.g., factory methods)." -incorrect. Only interfaces prevent static methods. But even then, you can declare inner classes in interfaces that have static methods so you at least have namespace encapsulation. Though honestly I don't see the value of abstract classes.. Whenever I've seen one, I've found a need for it to have instead been a pure interface. It's really just laziness on the coder's part in my opinion (delgation to utility classes it trivial with modern editors - and is FAR cleaner/easier to read then spaghetti inheritance).
" Meta-programming in Java is extremely limited - Reflection covers a few aspects, but even these are very awkward to use." -could you elaborate? The reflective aspects of Java exceed that of any language I'm aware of. Now the dynamic CODING is limited.. You can't change class hierarchies on the fly like you can w/ Perl, etc. You have to compile new code (e.g. with a byte-code enhancement), which has long term performance/bloat implications. And of course it's staticly typed for most operations (unless you just use java.lang.Object for everything - which isn't anywhere near as convenient as in lossely typed languages like perl/etc).
" Exception handling is awkward"
I've never found an Exception handling system I really liked. But I still love exceptions. And if you use a J2EE or spring environment, excepts 'do the right thing' in java moreso than in most languages I've seen.. Try throwing a random exception in a complex javascript app - see if your program continues proper execution. Perl is more than happy to default by aborting (and most CPAN libraries except as much). In contrast, in most java frameworks, you have a thread-safe, state-independent workflow with thread-locals storing transaction caches, etc.. They all have nice registered undo operations.. So at the J2EE EJB/servlet/JMS or pretty much any spring widget exception outer-most loop.. Cleanup is almost always assured.. Of course, this assumes you follow the recommended conventions - meaning don't EVER use global variables that aren't designed for concurrency and transaction awareness. Hell, just don't use global variables. The solution that spring provides is to say Sun got it wrong, and you should NEVER use checked exceptions - I get a lot of flack, so I'll understand if you don't see the light either. That if you're unfortunate enough to encounter a method with checked exceptions, catch it and re-wrap it with an appropriate category of Runtime Exceptions.
", there is no multiple inheritance"
-opinion - C++ M.I. is wrong wrong wrong. private inheritance is fine - essentially templating code. But multiple public virtual inheritance seemed wrong to me even when I was in CIS 101. And many books formally discourage it's use. But again, modern editors are such that delegation can solve many if not all of the value-add of multiple concrete inheritance.. In almost every instance, interfaces
apache commons has a copy on write library (can't find it at the moment).. Here's what I found on google: http://www.java2s.com/Code/Java/Collections-Data-Structure/CopyOnWriteArrayList.htm
It actually works well for concurrency too - you don't have to synchronize read access.
Copy-on-write maps are particularly good as well.
I'm not exactly sure what you're asking for though. You're wanting compile time detection that a data-structure is contractually guaranteed to not change, and thus return a reference, but if the compiler somehow detects that a particular call will explicitly make changes, then instead perform a pre-emptive clone.
You can already accomplish this with value-objects.. Namely use classes with private fields, getters, no setters and a constructor for initialization. If you need to change the contents, you explicitly clone.
You can also take a cue from the C++ 'best practices' and use explicit ref-counting. By convention the returner decrements a ref-count before returning (e.g. via finally). The caller increments the ref count.. It gets passed around.. If you ever need to modify the structure, you check the ref-count - if zero you modify.. Else you clone prior to modification. C++ can hide this slightly better than java in that you get immediate-execution auto-destructors, though you have to pay extra performance for thread-synchronization.
There is nothing preventing a VM vendor from extending an object class so you can mark it as copy-on-write ref-counted. I'm not sure that this really buys you as much as you think it would though. For little 5 field classes, there can't possibly be any benefit of constant ref-count adjustments. For large byte-arrays - the hidden magic clone could be a major memory hog. For arrays in between, you might as well just use data hiding and do the copy-on-write yourself as I've outlined above. I just don't see a region where this buys you anything without incuring major headaches.
How to fish - that would be state sponsored colleges (community, trade and even big ivy league - I had a nice tier-1 subsidized state education at 1/20th what I hear people say they paid around the same time). It would also be that whole - I don't know, K-12 free system. (usually funded by gambling and property taxes). Once upon a time, teaching how to fish actually meant just that.. learn how to catch freaking food because they've literally not known anything else in their entire lives except how to learn how to beg. While we may still seem archaic, the poor have EVERY opportunity imaginable in the US. Some people are hit with unfortunate disabilities, or are part of really socially / emotionally destructive cultures. But the opportunities are there front and center. They have only to decide they need to make the effort to learn to read, and thereafter to actually take time from sports/TV/music and actually READ. That is so much more than most of humanity has ever had before it.. Public libraries and a mentor willing to sit with you for 12 years until you can learn to read.. That was so far removed that thousands of years went by with only listening ot a catholic priest remind the head-of-household how to treat the rest of the family while they weren't hunting/farming.
But you're missing something..
We simultaneously discovered algorithms and electronic switching circuits (in different centuries even). But the practical application of complex repetitive algorithms ultimately was contingent on the advancement of the physics model. From gears/belts to electro-magnetic solinoids to diode-resistor circuits to field-effect transistors to MASSIVELY parallel transister farms - and possibly to quantum state management.
As each technical hurdle of physics was achieved, we were able to explore ever greater algorithms, until we could write algorithms OF algorithms (ruby-on-rails molds most all aspects of CIS from english constructs into organized hyper-complex code - something Lisp/prolog hasn't seemed to practically achieve). Map-reduce structures can pass tertiary abstract algorithms to both data and algorithm streams.
The order of complexity (allowed by the increasing algorithmic processing capacity adapted to particular classes of algorithms) is slowly allowing us to approach practical computational autonomy. Meaning a proto-brain.
Fundamentally I agree with you that you don't model the software of MS word with differential equations on the circuit board - though I believe you could. BUT both processes are / were ultimately necessary.
I think you're over stating things here.. In comparison, look at how our evil over-lords have enslaved us by learning about gravity. We really can't risk letting them learn about the next level - sabots to the factory machines I tell you!!
Plus I roll my eyes whenever I hear people talk about free will. It is a completely irrelevant question - it can have zero possible impact on your day to day activities (or at most an equivalent impact as learning that it's raining outside). Even a resultant decision to commit suicide is more attributable to the emotional stability of the person than anything else. Consider for a moment why you don't go around raping every orifice that moves. I'm pretty sure God has nothing to do with that decision. It's the same reason why Dogs don't do it - because they learn (often the hard way) that it's not always prudent.
Can't tell if you were joking or not. So I'll play along for fun.
:)
"This means either you believe you exist, and if that is the case then you have to solve the mystery of your own existence."
There is no intrinsic requirement to find one's origins.. We're not all salmon.
"Or you don't believe you exist, and consciousness and free will are fake illusions."
Some random definition which seems to agree with your argument:
consciousnsess: aware of one's own existence, sensations, thoughts, surroundings, etc
Thus consciousness implies existence by definition. But the reverse is not intrinsically true. You are either existent and conscious, non-existant and non-conscious, OR non-existant and falsely conscious.
I can describe to you a character that is fully aware of itself and it's surroundings.. But then I can tell you afterwards that it doesn't exist. The virtual construct is by all measurable means to you existent, except that it was a lie / fabrication (e.g. a play / cartoon / software program). But most importantly what DOES exist - the 'story' of the non-existent character is defined as fully conscious.
Thus illusion of consciousness is not an illusion to the character, but to the receiver of the fabricated story. HIS consciousness is real - only the projection of his existence has any 'fakeness' (exclusively in the mind of the story teller - unless and until they share the fakeness of the character to the audience).
Free will is also completely abstract and meaningless here as well. The fake character has no knowledge of this philosophical strife.. He acts consistently with his presumably consistent personality and life-struggle.. Making emotionally impactful, gratifiable, or regrettible decisions (or willfully avoids such decisions). Whether his story embraces the duality of his universe and the story-teller is fully within the control of the story teller (so long as the story teller controls the knowledge of the character's existence). Meaning, you as an audience member wouldn't debate with a friend whether their brother ACTUALLY graduated college or not - your knowledge of what this supposed brother did is completely outside of your knowledge .
Why is this relevant?... Two words.. J. C.
If you learn the syntax inside and out, perl has some of the most concise verbs I've ever used. 90% of the perl scripts I've written were 1 liners (where a line can exceed 200 characters).
... /end/) && $words{$_}++; END { print join "\n", map { "$_ : $words{$_}" } keys %words }' file.txt
perl -ne 'chomp; (/start/
skype on linux is buggy and so so. I give it two chances to get better under MS management, slim and none. Thus as an avid promoter of thin-client linux boxes, I'm not unlikely to want to risk investing in corporate multi-screen-sharing chat accounts, and or skype centric voip phones.
While not a death knell for say.. The one that hit me hard was visio. From $50 to $300+. Most of my co-workers who can 'justify' the added costs say it's crap these days anyway.
I'm sorry, but I'll have to reply later because my windows server says it's patch tuesday and I have to reboot. Oh wait, I'm on a 300 day uptime linux desktop - whew.
I agree that OS is generally not a critical factor in the ability or lack thereof to scale. But I would argue that windows is closer to Oracle in needing fine-tuning to properly be used. Linux stacks, in my experience are closer - out of the box - to a final configuration, especially since it's free to re-distribute, you can download a configuration fine-tailored to your specific needs.
I would also argue that linux has a much smaller foot-print that lends itself better to scaled shared OS hardware usage. Targetted boots (or specialized user-mode-linux style VMs) can have less than 2 meg of overhead for each virtual node. Not that windows CAN'T do this, but you only have one company that's legally allowed to try to offer it as a solution.
Most of the time, this doesn't make any difference, so in general I agree with you.
Considering that amazon and rackspace lets you 'lease' a VM for like $30 / mo, I'm not aware of web-services much less than $10 or $15 / mo. By going 2x the lowest possible price, you get a full rooted VM. You can put your entire software stack on there. For slightly more you can add things you get important things like load-balancing, fault-tolerance, backed ups, remotely accessibility anywhere in the world, reasonably security (pre-shared keys). It can leverage an international CDN for low ms response times. Takes advantage of unlimited (non-free) highly-redundant storage. You have the option of leasing web-services such as clustered data-stores, message-queues, email-services, credit-processing services (not at rock bottom rates, but still pretty competative given a micro-payment type model). If you want to go micro-service, google-apps is great - more importantly is more future proof. I'm sure in the past year since I last looked, there's a lot of competition in this space (linode is one that comes to mind).
If you're trying to solve a business need and it isn't based on cut-throat razor thin margins, then I don't see why you'd need to re-invent the wheel on every aspect of the software stack.
The single biggest reason to go cloud (IMO) is to avoid a slashdot effect. Bandwidth choke-points are gone. So long as your landing page is static / cacheable, and ideally in a CDN (rackspace/amazone provide it, I assume google-apps does as well), then you at least get people in the front door no matter what happens.
... sure). If you're lucky enough to have a business model that can fit in RAM or be geographically / lexographically partitioned, then count yourself lucky.
No matter how much infrastructure and BW you purchase, it won't be enough to meet your launch date's advertising draw (assuming you have paid advertising / viral-ware). And it's ungodly expensive to maintain that BW capacity 24/7 - especially prior to launch.
For dynamic data, yeah, there's no such thing as cloud-scale real-time computing. Ultimately it all comes down to in-RAM DB's and or sharding - both of which don't generally solve multi-million dollar problems very well (multi-billion dollar
Everything else comes down to ingenuity of software/network/data design. But of course, that's all predicated around having a sound business model.
You probably don't like btrfs for boot - as this is probably too bleeding edge, but once solid, the advantage is high-degree of replication-factor for a small partition.
Say you put 100Meg.. You can have it replicated 4 ways across 2 disks - basically similar to using mdadm with a R1 for the first 100Meg of each disk.. But without having to have a complex setup that's isolated from the rest of the system.
? Do you mean the RAID-5 write-hole? R5 wasn't available as an option as of Fedora core 14. :( But I'm certainly waiting for it - means I can finally get away from R10 costs / drive-count limitations.
Well, I doubt you can say 'no' overhead. COW fragments modified chains at 4K grains (of otherwise fully contiguous chunks with a single piece of meta-data (the starting disk-block+length). So if you have a large file that's random-access modified (like a DB), then it's read-performance will degrade overtime due to random seeks.. Though I bet it's better than qcow2 fragmentation since all data-block-references for a given file are contiguous in the "inode" record. Thankfully btrfs has defrag support so this can be mitigated, but for a 24/7 DB server that's not likely to be practical. Granted this is just one case, and I totally support the 'yum upgrade' then reboot/revert concept. :) Here's crossing my fingers.
Because LVM is not the panacea you seem to make it out to be, and mdadm that don't span the entire disk partitions are a pain (I've been using advanced features of both for 5 years, namely non-symmetric disks FORCED together with lots of LTC). zfs/btrfs have seamless volume-size/volume-distribution/volume-affinity management. Technically I can replicate many/most of it's features with LVM/mdadm/extX, but most operations say 'should backup' - not trivial when 55% of disks are already utilized.
I haven't done extensive testing of copy-on-write of btrfs v.s. LVM, but LVM cow is large-block oriented and thus painful for micro-writes of an underlying VM - I'm resorting to qemu's qcow2 on ext4 so I can get large-blocks with small COW, but it's still slow as a dog v.s. raw sparse-allocation. When I have time I'm going to play with btrfs's buffering/queuing of COW structures. I doubt it's any faster, but at least I don't have to suffer over-allocation (meaning it's free to allocate a partition in btrfs for a sparse VM, unlike w/ LVM).
Note, the ext4 gives me something that approaches raw LVM partitions for mysql INNODB data-blocks or VM images. (e.g. contiguous spans with little/no metadata random disk-accesses for multi-terabyte large files).
So I challenge the notion that ext2, netapp or bust. I've used just about all these configs.. iSCSI, aoe, dbrd, 3com, netapp, extX, XFS. It's just frustrating that the limitations of each of these toolchains don't seem to be mitigated by taking the best ideas from each approach. So right now, I'm cheering for btrfs, because it SEEMs like it could take the advantage of many capabilities (zfs just doesn't seem to have the performance, even though I love the RAID-Z concept - closer to netapp's WAFL in terms of RAID w/o consequences). The problem is that it's pointless to have a resizable partition if the least defined partition-size (root partition) NEEDS to be extX instead of btrfs.. So this lets my VM's boot with a more symmetric config.
Oh well, then I agree he's a prick. :)
If you're the It department of a fortune 500 company - you're expected to have a certain degree of fault-tolerance, as provided by full-validated documentation processes, isolated Q/A teams, employee rotation to prevent fraud, etc. Budget is never an issue - you buy SAS instead of SATA, you get netapp instead of 3ware cards, etc. The business isn't you, you're a smaller part of the business.
If you're a software contracting company - your margins are a little tighter.. You can say you need X amount of time/redundancy for good practices, but your competition can do it at 1/3rd the price (either through out-sourcing non-critical components or through consolidation of resources), then you don't have s much room for luxuries.
I've you're a startup, on VC-funding, and you're in a dry-spell, the making or breaking of a company has to do with making every resource as efficient/effective as possible. 'Documentation' and modularizing critical designs so they can be worked on in parallel is a luxury that is at odds. Here, the 3 man tech-team is most productive. Large enough to divide most tasks, small enough to communicate every aspect verbally - documented via issue-tracking.
I'm pretty sure that most developers are not employed by fortune 500 companies, but your mileage may vary. Hiring a new employee into each of these domains is radically different. And if, as I'd suspect, the majority of hires are into 3-man teams (even if that's only a department of a larger organization), then the issues I've outlined are certainly at play.
*eeeeh* wrong answer. If I was interviewing someone that was straight out of college - I'd ask what projects they've worked on - what languages - what are their viewed strengths of those languages. Walk me through how you've solved a problem.. I'm looking for how they did their research. Did they read a book (end to end), did they just google a single one-line answer, did they read through blogs (were they able to figure out appropriate sites to look at), did they compare and contrast? Did they write little micro-unit tests to prove/disprove what they'd researched. Have they ever tried to wire two languages together (batch/shell scripting to launch their larger app). Have they spent a lot of time learning their OS of choice? (Do they know ALL the power commands of their OS/editor). I don't care that they KNOW things, I care that they've determined that some problem in their life require that they learn something new.. And most importantly, I need to know that they have enough diverse almost-lost knowledge that they can quickly go to some reference place or places and re-learn something - hopefully not from scratch every time.
I don't care the breadth, but I've worked with genious's, mild genious's, hard-working average people, and been completely satisfied.. I've even worked with lesser intelligent tech people that worked very hard and were very concerned with verifying themselves - so I feel comfortable with them doing compartmentalized work.. But what I can't stand are people that throw their hands up and essentially have you micro-code their work for them. It reminds me of 'group projects' back in college where I had to do all the work.. There, it just meant grade-inflation.. But in a real work environments - it means they literally serve as net-negative utility. Not only am I ultimately doing their work for them, but I have to do it slower so they can comprehend each step. It's not their ability - it's their approach, and risk-aversion.. Just make something that functionally works, then ask (at a high level) if their general style (which they need to be able to verbally communicate) can be improved. And that's why seeing that you can accomplish things on your own is critical in employee selection. If you could get from A to B without having someone do it for you - then you can add utility to a firm. If you're going to go the MBA/networking route and use psychology to get people to do work that you take credit for, then step on their heads to get ahead, then you're going to stand out like a sore thumb in the tech world.
Easier said then done.. This assumes you have appropriate risk-isolation, that you've properly and fully documented your processes in an low-IQ documentation-level; it assumes you have high-talent mentors with lots of free time.
The reality is that Xeros research centers, google/MS research centers are relatively small, and certainly not large enough to encompas the entire graduating class of any given year. The reality is that companies, especially start-ups, live on a margin - likely already in the red. Highly talented people are not necessarily best tasked with documenting, making repeatable processes, nor are they apt at being mentors outright (personalities that do this well are rare).
If you have a single company and a single network - can you really task a new-hire with managing the CISCO router? Nor do you likely have a 100% sandboxed duplicated environment?
Generally when you want to hire new developers, it's because your tight-nit core team is over-tasked and deadlines are slipping. It is often very difficult to grow this team in any fashion - even with very high end developers - I just rarely see it properly done with straight-out-of college types.
It's generally most seamless when you can give them a complete isolated project (say an infrustructure support tool) - or have them pair program with someone. But these aren't usually the immediate needs of a growing business.
I don't see a problem with this.. Consider the construction industry. You hire a guy to build your deck, you don't exactly want someone that's making it up as they go - you'd like to know they've accomplished similar projects in the past. It's fine if you hire someone with an apprentice - since the guy you're hiring is the one who's ultimately responsible.
Software development isn't exactly free-lance just yet - you still have a majority as direct employed, for better or worse. And even with free-lancing, you don't generally see a lot of sub-contracting to apprentices. But there's no reason why you shouldn't.. You're high priced hourly contract rate can be better managed by sub-delegating low-risk tasks.
As for fostering corporate loyalty - I've been with several firms (small ones even) that have internship programs - such interns almost never ultimately stay with the company, but this does serve the role you raise. But from my experience, this is an incredibly painful experience for the manager (for which I've severed on a number occasions). You really salivate when you come across people that have just leveraged open-source projects on their own time (possibly while they were studying in college, possibly as a second career). People that have appropriate work-ethics, strongly motivated, and not afraid to take on risks.
Perl is a bad example - it's called CPAN.
SQL examples are trivial, just show the schema on a USB drive.
github is 100% free, and awesome for entire open-source project-stacks.
PHP shouldn't be too bad on a USB drive - or can easily run on a WAMP/LAMP stack on your laptop.
As for hosted services, there's amazon/rackspace, and google-apps. Amazon/rack-space are dirt cheap, and google-apps are free for low-loads.
amazon/rackspace have zero restrictions on your application-stack (you get root/Administrator to the machine).
google-apps assumes python/java, but if you know what you're doing, scripting/etc are detriments to dynamically scalable solutions anyway.
I'm sure there are tons of Xen/KVM based solutions to choose from, so I'm not sure what you're complaining about.
Your opinion v.s. mine I guess. One of Perl's mottos is to minimize surprise. Both perl and JS polymorphically convert from int to string and back. Don't believe me?
x="5"
y=x/2
y == 2.5
So JS 'smells' like it wants to do polymorphic base data-types.. But it fails miserably to be consistent. Numbers are more useful than strings (my opinion I guess), so if you've bothered to convert from a string-space to double/integer space, it makes little sense to squash it back to string-space. Now in perl, string space operations are generally explicit "$x", thus all the 'magic' tends towards converting into integer space.. Most other languages make it harder to convert into string space, so I can see why JS made the fateful decision - both JS and Perl are essentially string-centric languages, but without trivial string generators, the only convenient operator JS had was '+'. So basically if any rval is a string, the whole operation is overloaded to string conversion.
Really, I'm just lamenting the lack of optional data-types (scala, etc). In perl, we could say
sub foo($$) { use int; return $_[0] + $_[1]; }
Not that this is beautiful code or anything, but the datatypes are coorseable as a compiler-flag is the point. Technically, JS is JIT'd these days, so
function foo(x,y) { return Number(x) + Number(y); }
is plenty fast - just reads funny (yes, I know the perl was nastier in comparison, but there are more elegant blocks of long-spanning functions where these sorts of auto-stringification can accidentally be introduced - namely function-returned-values).
""+" doesn't append _two numbers_, but it can append _number to string_ - which you can have in any language with operator overloading."
function foo(x,y) { return x + y; }
foo("5",6) == "56"
In every other language I've seen, the CORRECTly expected result is 11 or error. Perl, C++, etc. The point is that you can never trust your input if you are expecting numeric.
You must guard the inputs with explicit (and thus inefficient/unreadable casts). If you're using a 3rd party library, you'll be pulling you hair out trying to figure out what went wrong.
The language is full of such wtf's. While you can happily redefine most core operations (e.g. how jQuery fixes IE), you can't overload the + operator. Call my cynical, but I don't like languages that let you corrupt basic building blocks.
That being said, javascript is excellent at what it was designed for - and passable for what it's currently used for, but I fear for the future if it's the basis of future industrial strength applications.
One place I WOULD like to see it extended is DB's.. CouchDB has a very nice java-script based map-reduce framework - it leads to concise and expressive code (that's really NASTY if plsql, etc are used).
Basically javascript is excellent fragment-code. But HORRIBLE for modular libraries - having to write an entire library (like jquery) in a scoped wrapper then assigned to a mutable/corruptable symbol is sick. (Especially since library A will mutate library B without permission - hello 1970s!!)
Actually - I think you're being short-sighted about this. It isn't that people prefer it or not.. It's that there are billions to be made, forcing people to re-purchase their $10,000 DVD action-movie library in blue-ray.. Another billion in repurchases of blue-ray-3D. So we needn't worry about us being 'duped' into these purchases, we need to instead worry about exclusivity. You like revenge of the nerds, but you don't subscribe to netflicks.. Sorry, only available purchase for you (5 years from now) is to buy the Blue-ray + DVD + digital-copy + 3D edition that also couples 5 editions.. Bundle cost - a BARGAIN at $30. Considering this is like a $2 marginal value - the frustration and impulse purchase made an incremental profit of $28 by throwing tons of 'perceived value' at the otherwise non-interested customer.
For example, I wanted mega-mind - and figured I might want to put it on my android so my daughter can watch it in the car.. But, unlike the 5 other DVD's I purchased with this combo, the ONLY one available to me on discount day (the day the DVD is released and thus sells for $8 under retail) was the full on 3D + Blue-ray + DVD + digital-copy.. It was only like $4 more, but I felt a certain anger that I was being force to subsidize this.
Part of the reason I personally have a problem with 3D.. It's speculated that it's bad for adults eyes, and very bad for children's eyes. Further my wife happens to not be able to see 3D - so it's actually a detriment for family viewing overall. Personally, in the theater I enjoy the 3D experience - but I'm almost never there by myself, so overall, I worry about the overall leaching of the lower class through malicious bundling and marketing.
"I have taught Java for years, because many colleges think it is a good first language to learn. Only recently have I actually attempted to develop commercial quality applications in it. Frankly, Java sucks big green ones."
Opinion - as I would say the same for Ruby/php/perl. And I lothe non-portable languages. Java is really the best of what's available in my h. opinion.
"Generic types (with type-erasure) are a total hack"
-agreed, but it solved a particular annoying problem of having maps of maps of maps and having no clue what the hell's inside. Generics gives good coding feedback - reduces errors.. Performance wise it is worse than not having them though.
", denying the running code valuable information."
-incorrect. So long as you extend a class with a generic, you can query the generic's concrete type.. It's cludgy, and best delegated to discovery utility classes, but very very vaulable in producing dynamic code (such as for database abstraction layers).
" Abstract classes are only half-implemented, since you cannot have abstract static methods (e.g., factory methods)."
-incorrect. Only interfaces prevent static methods. But even then, you can declare inner classes in interfaces that have static methods so you at least have namespace encapsulation. Though honestly I don't see the value of abstract classes.. Whenever I've seen one, I've found a need for it to have instead been a pure interface. It's really just laziness on the coder's part in my opinion (delgation to utility classes it trivial with modern editors - and is FAR cleaner/easier to read then spaghetti inheritance).
" Meta-programming in Java is extremely limited - Reflection covers a few aspects, but even these are very awkward to use."
-could you elaborate? The reflective aspects of Java exceed that of any language I'm aware of. Now the dynamic CODING is limited.. You can't change class hierarchies on the fly like you can w/ Perl, etc. You have to compile new code (e.g. with a byte-code enhancement), which has long term performance/bloat implications. And of course it's staticly typed for most operations (unless you just use java.lang.Object for everything - which isn't anywhere near as convenient as in lossely typed languages like perl/etc).
" Exception handling is awkward"
I've never found an Exception handling system I really liked. But I still love exceptions. And if you use a J2EE or spring environment, excepts 'do the right thing' in java moreso than in most languages I've seen.. Try throwing a random exception in a complex javascript app - see if your program continues proper execution. Perl is more than happy to default by aborting (and most CPAN libraries except as much). In contrast, in most java frameworks, you have a thread-safe, state-independent workflow with thread-locals storing transaction caches, etc.. They all have nice registered undo operations.. So at the J2EE EJB/servlet/JMS or pretty much any spring widget exception outer-most loop.. Cleanup is almost always assured.. Of course, this assumes you follow the recommended conventions - meaning don't EVER use global variables that aren't designed for concurrency and transaction awareness. Hell, just don't use global variables. The solution that spring provides is to say Sun got it wrong, and you should NEVER use checked exceptions - I get a lot of flack, so I'll understand if you don't see the light either. That if you're unfortunate enough to encounter a method with checked exceptions, catch it and re-wrap it with an appropriate category of Runtime Exceptions.
", there is no multiple inheritance"
-opinion - C++ M.I. is wrong wrong wrong. private inheritance is fine - essentially templating code. But multiple public virtual inheritance seemed wrong to me even when I was in CIS 101. And many books formally discourage it's use. But again, modern editors are such that delegation can solve many if not all of the value-add of multiple concrete inheritance.. In almost every instance, interfaces
apache commons has a copy on write library (can't find it at the moment).. Here's what I found on google:
http://www.java2s.com/Code/Java/Collections-Data-Structure/CopyOnWriteArrayList.htm
It actually works well for concurrency too - you don't have to synchronize read access.
Copy-on-write maps are particularly good as well.
I'm not exactly sure what you're asking for though. You're wanting compile time detection that a data-structure is contractually guaranteed to not change, and thus return a reference, but if the compiler somehow detects that a particular call will explicitly make changes, then instead perform a pre-emptive clone.
You can already accomplish this with value-objects.. Namely use classes with private fields, getters, no setters and a constructor for initialization. If you need to change the contents, you explicitly clone.
You can also take a cue from the C++ 'best practices' and use explicit ref-counting. By convention the returner decrements a ref-count before returning (e.g. via finally). The caller increments the ref count.. It gets passed around.. If you ever need to modify the structure, you check the ref-count - if zero you modify.. Else you clone prior to modification. C++ can hide this slightly better than java in that you get immediate-execution auto-destructors, though you have to pay extra performance for thread-synchronization.
There is nothing preventing a VM vendor from extending an object class so you can mark it as copy-on-write ref-counted. I'm not sure that this really buys you as much as you think it would though. For little 5 field classes, there can't possibly be any benefit of constant ref-count adjustments. For large byte-arrays - the hidden magic clone could be a major memory hog. For arrays in between, you might as well just use data hiding and do the copy-on-write yourself as I've outlined above. I just don't see a region where this buys you anything without incuring major headaches.
How to fish - that would be state sponsored colleges (community, trade and even big ivy league - I had a nice tier-1 subsidized state education at 1/20th what I hear people say they paid around the same time). It would also be that whole - I don't know, K-12 free system. (usually funded by gambling and property taxes). Once upon a time, teaching how to fish actually meant just that.. learn how to catch freaking food because they've literally not known anything else in their entire lives except how to learn how to beg. While we may still seem archaic, the poor have EVERY opportunity imaginable in the US. Some people are hit with unfortunate disabilities, or are part of really socially / emotionally destructive cultures. But the opportunities are there front and center. They have only to decide they need to make the effort to learn to read, and thereafter to actually take time from sports/TV/music and actually READ. That is so much more than most of humanity has ever had before it.. Public libraries and a mentor willing to sit with you for 12 years until you can learn to read.. That was so far removed that thousands of years went by with only listening ot a catholic priest remind the head-of-household how to treat the rest of the family while they weren't hunting/farming.