I comment rarely, but had to chime in as the ACA was very important to me in terms of starting a company.
The ACA also allowed me to pursue founding a company. 6 months before the ACA kicked in, I left my job to start a robotics company. As I was only 29 years old, I did not think it would be a problem getting individual health insurance -- I had done it in the past when attempting my first venture.
What ended up happening was that every health insurance company rejected me for having the pre-existing condition of asthma! It made no sense as I was very healthy and my asthma under control as long as I took a control inhaler everyday. The cost of my medicine would be way less than the premiums I paid -- but some actuary somewhere decided I was too high risk!
For 6 months, I was scared of getting sick or injured -- to the point where I was considering giving up to get a job just for health insurance. That thought to me was just so ridiculous and heartbreaking that I couldn't do it --I just kept telling myself that I had to make it to Jan 1.
I was overjoyed the day I got my insurance card -- it was a huge sense of relief. What brought me even more joy was knowing all my fellow Americans whom also could not get or afford insurance could finally receive it.
Today I no longer need the ACA -- our company is doing great, we're well-capitalized, and provide excellent health insurance to all of our employees. Without the ACA, this dream would not have been possible. We were able to create wealth and jobs because of the ACA -- it makes no sense to repeal it.
Even before I needed the ACA -- I had enough empathy to know that every person has the right to health care and one of the biggest reasons I voted for President Obama. When it affected me personally, it obviously hit even harder. The GOP's lack of empathy as well as a real solution to the problem are just infuriating -- it is absolutely shameful and disgusting how they are attempting to repeal this law.
elon = grit, as an entrepreneur when i have dark times, i'll read about him to get amped. my favorite quote: "Optimism, pessimism, fuck that; we’re going to make it happen. As God is my bloody witness, I’m hell-bent on making it work." -- back in 2008 after the SpaceX Falcon rocket failed to make orbit 3 times. More context: http://dcurt.is/elon-musks-determination
That's a great question. Here's my take on it:
I switched from Windows to Linux over a decade ago...but as somebody that has to often write a lot of C/C++ code, man do I miss Visual C++. I've gone through all the IDEs (Eclipse, Code::Blocks, Anjuta, QtCreator, etc). QtCreator comes close for me, but I feel most comfortable with Sublime Text and a terminal for compiling/debugging/profiling.
Visual C++'s intellisense actually worked...not perfectly, but much better than what I've seen on Linux (QtCreator is close). Their debugger quality, source control integration, profiler integration, target code quality, compiler error messages/feedback, a call browser (a feature I still can't find on any other IDE, not the same as grep)...all wonderful. All of that stuff can be leveraged for writing cross platform code, including the Linux kernel. I know it sounds insane to use a Windows-specific IDE, but VC++ is that good of an IDE. Personally I would think it's way more trouble than it's worth, but apparently the OP felt otherwise :)
I don't have many good things to say about Microsoft's products, but for Visual Studio I only have praise. MS has always excelled with compilers, languages, development tools. People mock Steve Ballmer for his "developers, developers, developers!!!" rant, but IMO MS's dev toolchain is a big part of how they attracted developers and achieved market domination.
Good to see work is being done on it, but until it's in the main implementation for at least a year...I wouldn't trust it on anything that matters.
The advantage of kernel threads is that they have way less overhead than a process (both in context size as well as more efficient memory caching at processor and OS level)...though more than a user-level thread. If there isn't any sort of message passing between two processes, the only mechanism I can think of of sharing data is shared memory (i.e and mmap) which is just as efficient as threads sharing the same process heap...but awkward (yes there are sockets, file IO, signals, queues, etc, but not as efficient). Even if OCaml provides a way to abstract that to be more palatable + safe -- my argument is that in a multicore world, kernel threads must be a first class citizen and the programmer shouldn't have to resort to tricks to harness it -- otherwise it's a major flaw that is going to prevent future adaptation. Also, as the number of cores increase, this is going to matter more and more...so hopefully this stuff gets out in the wild soon.
What's interesting about Haskell in this regard is due to the pure functional nature, the Church-Rosser theorem applies...every function call could be executed in its own thread without protecting any resources with locks/mutexes/etc! I haven't studied the compiler design of Haskell, do you know if the compiler can delegate function calls to a thread pool automatically?
Look, I love OCaml and it's my favorite language syntax-wise, but the real big elephant in the room is not its JS-backend maturity. Rather it doesn't have kernel thread support...all threads are user-level just like Python due to a global lock for garbage collection. This means threads do not run concurrently across multiple cores. This is UNACCEPTABLE in 2014 - roughly 8 years since processors went multi-core. Intel is talking about having hundreds of cores on a single die by next decade and having programs that can't take advantage of that is extremely limiting.
Xavier Leroy (the creator of OCaml) and his team at INRIA didn't think this was a big deal because when they were writing this stuff, processors were single core and had been since the beginning. Sure there were multiprocessor machines (not the same as multicore as there are multiple die), but those were only meant for servers/workstations. OCaml seemed very promising around 2006, the peak and end of the single core era with the Intel Pentium 4. What made OCaml so impressive was not only was it this beautifully simple, high-level functional language, but that the native compiler produced very fast code that was comparable to C/C++ performance. However, as multicore processors were introduced (Intel Core, Core 2), not having this capability made writing new code in OCaml less appealing. There are solutions like MPI, but that's lame. The same excuses you hear in the Python world about having true multithreading you hear in the OCaml world. Microsoft was able to do it with F#, which is essentially a clone of Caml by targeting their .NET CLR. Haskell is able to do it with GHC.
I still think OCaml is a wonderful language -- not having true multithreading doesn't make it useless. However, to me it has become more like a statically-typed Python which I can use for scripting. Having to use hacks like MPI to do multicore processing is a huge turn off in a multicore world. This is again nothing against the language, but the standard implementation needs a concurrent garbage collector and kernel threads. Otherwise I think OCaml may be doomed to irrelevance in the long run, which would be truly sad.
As somebody who spent a few years in Saudi Arabia (as well as visiting some of its fellow oil rich neighbors)...I can confirm this problem which is endemic to all rich Middle Eastern countries. As an American of Indian ethnicity (I can speak Hindi), I was able to see how people from these countries treat folks from the Indian subcontinent.
They're all basically nouveau-riche. They bring in what is slave labor/indentured servitude from poorer countries like Pakistan, India, Bangladesh, Nepal, the Philippines, etc. They clean the toilets, they serve the food at McDonalds, they build every house and skyscraper, the work the oil fields...in other words all the dirty jobs. Likewise people from western countries are brought into do the white collar work -- doctors, engineers, architects, etc....though they're having a blast.
I would say the situation is analogous to illegal immigrants from Mexico in the US -- but believe it or not we're way way way way way nicer to our illegal immigrants than these countries are to their legal immigrants! They live in terrible and barbaric conditions very similar to those described in the article. What makes it all so horrid is the disparity in wealth between the way they live and the way the elites live. If you're in Dubai, you can go snowboarding on a ski slope inside a shopping mall -- built by some guy who's in the outskirts of the city, sleeping in a hot tin can with 12 other guys, a broken AC, completely sore body, and sun burnt skin. You'll sometimes see Arab guys screaming at/assaulting these people at stores, shops, or taxis as if they're feudal lords talking to their peasants.
My father calls these immigrants heroes. They take shit (physically, verbally, mentally) you and I could not imagine just to send back the equivalent of $100-$200 a month to their families back home. That small amount of money enables them to educate their kids, feed their family, build homes, businesses, etc. They dream of the day they get to return home and finally see their families again.
As I always used to tell my students, your degree is just a piece of paper that helps you get your foot in the door. Its worth is equivalent to the effort and energy you put into it. Those that work hard and are passionate about their major, whether it be computer science or whether it be philosophy -- they'll end up doing well in their chosen fields -- or at the very least grow as people. If you're really into what you study, spend a lot of your extracurricular activities in related areas (e.g. being in debate club if you're a political science major), and are excited about working in a field pertaining to your major, you will do well. If you came just to party, socialize, and not major in something that you didn't care about or find challenging...you'll likely not get your return on the investment. I majored with plenty of people in computer science, some were even able to cheat their way to decent grades. However, we all know how well that works when you have to sit down for an interview at Google or wherever and you have a blank stare when you can't tell the difference between a binary tree and an apple tree. Your computer science degree in that case is almost worthless.
So it's worth it if you know what you're getting yourself into. Some people think it's just a rubber stamp to a job that pays a minimum of $50K a year somewhere in the city where they can continue partying. Not true unfortunately. I knew since I was a child what I wanted to study...for most the answer is not that easy. I always suggest that if you don't know what you want to do, don't go into debt by going to college without a plan. Do something else -- join peace corps, volunteer, get an apprenticeship...maybe join a community college first. Getting a college education is one of the most fantastic and redefining experiences a person can have -- you may only have one shot and should feel blessed you have that opportunity. Don't squander it.
I think this is a fantastic concept with lots of potential! I especially loved the tongue-in-cheek humor -- "Eternal moral vigilance is no laughing matter."
In my opinion, deleting code is fine...however you should 1) be warned that it will happen in the near future if you do nothing about it and 2) it should be tied to some version control system (e.g. GitHub) where it pushes the deletes (maybe even creating a branch and remerging it so the changes are clear) so that code can be recovered if need be.
Vigil can maybe even have some logic built in if you revert deleted code it gets "angrier" and starts more aggressively purging code in the future :P
What's most interesting and beautiful about the concept of free, open education is that people that would not have access to a college education can now have it. I'm talking about people that are the poorest of the poor who would never see a university let alone be able to attend one. A lot of folks on here are talking about certification...certification doesn't matter, rather creating wealth matters! We're on YC Hacker News right now, I'm sure everybody has read Paul Graham's "How To Create Wealth" essay (http://paulgraham.com/wealth.html). A person with a college degree or higher is useless to society if they can't produce something with it. However, somebody with little or zero formal education that can create something world changing IS valuable! Just giving people access to information allows them to change their world and create wealth. Some of you may have heard of William Kamkwamba (http://en.wikipedia.org/wiki/William_Kamkwamba) who created a windmill that could generate electricity just after seeing a picture of a windmill on the cover of a book written in a language he couldn't read. I saw an interview with him on "The Daily Show" where he joked that when he had the opportunity to access the Internet for the first time, he typed "windmill" into Google and was like "where was this when I was trying to build that damn windmill?!". People like him can do so much just with a picture -- imagine if he had access to science and math lectures from an amazing university like Stanford.
We have finally reached that point (or are at least damn close to it) where virtually every person on the planet, no matter how poor, will have access to a computer and the Internet. That is all a person needs to access these resources. I'm sure everybody has been following the Raspberry Pi, a full-fledged computer with video output for $25 - and it's only going to get cheaper. People like Thruun and Khan are dead-on. The only way to get people out of poverty is by empowering them with knowledge and education. In my opinion, the work these folks are doing are the seeds of a coming worldwide renaissance where poverty and ignorance will be eliminated.
Even before I ever read GoF, I found myself using their design patterns in my object-oriented code (i.e. "reinventing" what already existed). At the time I didn't think it was any magic feat, it's just the way I organized the code. It's nothing surprising, all OOP developers end up doing this -- the abstractions provided by an object-oriented language naturally lead to the design patterns we see in the GoF book. In fac,t in the introduction of the book, the authors describe how the patterns came from existing, real-life software which they found worked well in practice. Reading GoF is useful to an OO programmer because whenever they encounter a difficult problem, there's usually a "pattern for that". Oh I need to manage complex states and state transitions - use a "state pattern". I need to route messages to any object that desires the message feed - use an "observer pattern".
As the article states, GoF patterns are a tool and shouldn't be treated anything more or less than that. I've worked with developers who treat design patterns with religious sanctity and their designs are convoluted with forced GoF patterns. The result is bloated code that is difficult to follow. Likewise I've worked with developers who think they're a scam and prefer to "cowboy" their own solution which either ends up reinventing a design pattern or just being plain ugly.
I saw some comments in this thread implying how language paradigms other than OOP (primarily functional) eliminate the need for many of the GoF design patterns. This is true, but it doesn't mean that functional (or whatever paradigm) languages do not have design patterns -- they have their own design patterns as well. For example, the concept of a "monad" can be considered a design pattern to implement side-effects in pure functional languages which lack that feature. Some design patterns transcend language paradigm, for example, Model-View-Control (MVC) is universal to procedural/imperative, functional, and object-oriented code. Design patterns also exist for concurrent computation -- a great example is "The Little Book of Semaphores" (http://www.greenteapress.com/semaphores/). The book details multiple "design patterns" for solving common problems with concurrent computation in languages that provide semaphores and threads as the primitive concurrent computing abstractions. However, to help make the point of the other commenters -- using a language designed for concurrency (e.g. Erlang) eliminates the need for a lot of these design patterns. On the flip side, using something like Erlang introduces a whole new set of problems meaning you need a whole new set of design patterns!
What I think was revolutionary about GoF was the coining of the term "design pattern". It's analagous to the concept of "algorithm" but not quite...it's more general than that. What's beautiful about the term is that it's applicable to more than just programming, but rather any sort of engineering, design, or problem solving. As the author of the article demonstrated, there are even architectural "design patterns". In any field, you'll have design patterns (they may not call them that) and books on them that predate GoF. However, the way GoF documented them as wonderfully and clearly as they did in their book...it's just beautiful.
I've seen this point brought up. Making some easy (which I'm all for btw) does not mean it has to lock down aspects that average users are not meant to look at it (i.e. DRM). It's fine if they hide them, but when there are software and hardware mechanisms that prevent power users from manipulating the device - that is unnecessary. I should be able to replace the OS as well as install any app that I please on the device. They are actually taking EXTRA steps to prevent me from seeing the internals by using things like hardware level OS image hashes (i.e. tivoization).
Now people say, I just want to use my device and get work/play done. THat's fine, I'm all for it. However, having control benefits everybody. For example, if you want to tether your smartphone and use it as a wireless access point, writing the software to do this is trivial (and a power user can do it for you). However, smartphone companies don't want you doing that...unless you pay them more money for that feature. That's kind of unfair, the smartphone company is depending on PROPRIETARY LOCKIN rather than real competition. That's my problem with it. They want to control your experience and make you think you can't get a PREMIUM EXPERIENCE without paying them ludicrous amounts. I mean, all tethering does is update a few IP tables here and there -- I have to pay 10 bucks a month for that??
Yeah sure APple did a lot of great things as did Microsoft and Google for bringing computing to the masses. However, they all did it based on the open innovation of others (kernels, compilers, text editors, web servers, etc). They've used those wonderful open things to create a wonderful easy to use experience. At the same time, they've added ARTIFICIAL CONSTRAINTS to it (e.g. again tethering) to create PROPRIETARY LOCKIN and make you think your device has less capability than it really has. If these companies stay on these same paths and people maintain the same level of compliance...we'll get to a point where ALL computers are useless and innovation can't happen. Again, easiness and openness are not orthogonal.
Wow, I had no idea I would stir up the beehive so much! Perhaps I was a bit dramatic in my presentation. The point I'm trying to make isn't that Apple, Google, etc are evil nor am I saying their products aren't good. The problem is things like DRM, net neutrality, software patents, privacy, developer and user rights, taking away control of information from users and throwing it in the cloud. THEY WANT TO CONTROL YOU SO THEY CAN CONTROL THEIR REVENUE STREAM AND ENACT PROPRIETARY LOCKIN! They would rather do that than have real competition! It's the Microsoft business model with sexier marketing. What happens when files go away -- how do I backup my data? Is my data even physically on my device? Is it located at some server at one of Apple's data centers? Are they securely storing it? Will I have access to it if they go out of business? Similiarly as a developer, how come there is no option for me to get my app onto the iPhone without being subject to Apple's App Store submission process? Sure, users may not notice, but they've created a major barrier to market. The excuse is that "oh we need to make sure it's user friendly and high quality", but we've seen often that they pull apps because they compete with something they're doing or they suddenly don't like the UI because it messes with Steve's vision of how your computer should behave.
I don't think having open technologies and easy to use technologies is mutually exclusive. Android is a great counterexample to iOS. For DIYers on Hacker News, another great example is Arduino. Also, if you haven't taken a look at a Linux distribution in years (or ever) like Ubuntu, you really should try it out. Not only is it free and open, but it provides (in my opinion) an easier and aesthically superior experience to Windows/Mac and is a way better option for 90% of users that do simple things like listen to music, watch videos, take pictures, and surf the web.
As one other person posted, they aren't trying to be evil, but they want to nickel and dime you at every step. They don't want you installing a more open OS on your device because they cannot control the experience (I gave the example of tethering in my original post). What scares them is giving you options that allow you to migrate away from their platform. A lot of people said "hey that's just business", but there are other business models than "proprietary lockin" that gives users flexibility and choice as well as generate profits for the company.
It's not anti-Unix or anti-programmer...it's all about being anti-freedom.
All these companies want to do is turn your computing experience into a locked down, controlled, monitored experience. They want to turn your limitless and powerful computer into a home appliance...like a blender or electric razer. No way to customize, no way to modify, no way to organize thoughts your way. No hacking or "jailbreaking" into your own device to give yourself features like "tethering". That would violate the ALL HOLY EULA (unless you paid $5.99)!!!
Also no need to understand how the technology works -- technology is now magic. And when technology becomes magic, they have control over you. Google manages all your e-mail, Facebook and iPhone manage your social life. Google and FB make their money through selling your information to marketing companies. Apple makes it by selling you hardware. Both of them make money by exploiting the lack of will by the masses to understand their technology and how it affects their rights and privacy. They make money when they are in control of you and your data. They make money by making you think you need a new computer when all you need is a better operating system.
Getting rid of files is like Newspeak from Orwell's 1984. They want you to be dumber. They'll take care of savin that file for ya, you just worry about eating nachos and 'batin. Besides, they need to take a looksie at it first to infer information about your shopping habits...
The point he's trying to make is that Lisp lacks typing. In Lisp, code is data and data is code. This is what makes it so powerful. At the same time, the lack of certain safeguards found in ML can make it dangerous. ML was meant to give the flexibility of a language like Lisp but with stronger guarantees for safety.
However, I think it's a bit extreme to say a Lisp programmer could never be sure that their program was going to work...that's just disingenuous. Lisp is a dynamically typed language, but it is a safe language.
To contrast this with C++. In C++, if I call some third party mystery function, I'm not sure if it'll cause some side effect and corrupt my process memory. I can arbitrarily create a pointer, cast things to whatever I want, do some memcpys and memsets and bring the whole thing down. Not to say they're bad languages, I'm a C++ guy myself...but a lot of the security vulnerabilities in operating systems and major libraries/apps is due to the fact they're written in C or C++. Languages like ML and Lisp prevent that.
-Good points about OCaml/Standard ML. One big omission though (at least I did not see it) was the lack of emphasis on the concept of "pattern matching". I'm not sure about SML, but with OCaml, everything is implemented using pattern matching. Pattern matching is an important concept in all functional languages to begin with. What makes ML datatypes so powerful is the ability to pattern match on typed expressions. Unlike dynamically-typed functional languages like Lisp, your expression and all of its subexpressions have a type. More importantly a type that can be statically resolved. When you write code it's guaranteed to be safe meaning that the code did not corrupt memory or perform operations that do not make sense (e.g. try to take the square root of the string "banana"). Unlike other clunkier statically typed languages, type inference automatically resolves the types of most values -- so the code ends up looking compact and clean like a dynamic language but at the same time type safe. Type safety is a big deal...ML makes it impossible to violate the type system. No recasting allowed, no way to corrupt the process memory, no way to cause runtime type errors :)
-Where it fails though still...and this is a big deal in this day and age, kernel level thread support. User level threads can solve a lot of problems, but when you're dealing with heavy number crunching and the algorithms of the future (computer vision, AI, highly parallel search, etc)...you need to use all the cores! Intel is talking about having thousands of cores on a single die by the end of the decade. We have to run 1000 OCaml processes and do process level messaging passing?? A lot of people are now looking to Microsoft's F# (virtually the same as OCaml sans OOP) as it targets .NET and supports true parallelism and a thread safe garbage collector.
-One thing about the original post which mentioned the lack of OOP. Perhaps not in SML, but OOP is well supported in OCaml (hence the O). People haven't given it a chance. It's really nifty...the biggest complaint I have is that type information from the compiler is hard to read due to the notation used for object types. Also, all of the standard libraries and most of the community only use the functional subset. There's good reason too, functional programming is very flexible.
-There are a lot of libraries out there for OCaml created by the community. However they vary in level of documentation. For the most part though, I've found 3rd party OCaml libraries to be of high quality due to the elegance of OCaml. Also, it's pretty easy to take a C or C++ library and write an OCaml binding for it. This is true of most languages, but it's annoying when the thing is already written for C++/Java/Python/etc
-Oh one really really cool feature of OCaml that nobody ever talks about -- you can actually read the code for the standard library! Have you ever looked at files like "iostream" for C++ or "stdio.h" in C. There are macros and templates and all sort of ugly craziness that nobody can read. I was able to open the standard library in OCaml and actually read it. I could see how they implemented standard modules like List, Thread, and Array. What's interesting is that most of the code would be considered inefficient by imperative programmers due to heavy use of recursion. However simple tail call optimizations by the compiler save the day!
You know how it is with benchmarks...it can vary so much. I'm not sure how much work is done these days on the OCaml compiler. I recall there being a big debate a few years back about it, a lot of people cried foul that OCaml benchmarks were close to C/C++ speeds because of the heavy use of OCaml's imperative constructs (rather than writing functional style implementations of the code).
In my experience with OCaml, you can write efficient code that approaches C/C++ speeds if you know how functional language compilers work. The biggest performance killer in functional languages is efficiently implementing closures on a stack based machine (i.e. funarg problem). OCaml is smart in that it implements activation records on the stack if it can tell that a function won't return a closure. If you're writing in a heavily functional style, you'll inherently create a lot of closures and lots of heap-based activation records (i.e. less efficient). At the same time, the compiler can do a lot of interesting optimizations that would be difficult in an imperative language. Pretty much every OCaml book including the official manual describes all the various places where you can have performance penalties and what OCaml is doing underneath the hood. Also like any half decent functional compiler, OCaml performs a lot of inlining which results in huge performance gains.
One thing to note, a big part of the reason why OCaml as well as other ML languages and Haskell have such great performance compared to other functional languages is because of very strict and static typing. For example, one of the interesting restrictions of the OCaml type system when dealing with objects is that you cannot downcast an object once it has been upcast (i.e. like a C++ dynamic_cast). Though this restriction is annoying, the generated code never has to do any runtime type checking - everything is statically verified!
The ACA also allowed me to pursue founding a company. 6 months before the ACA kicked in, I left my job to start a robotics company. As I was only 29 years old, I did not think it would be a problem getting individual health insurance -- I had done it in the past when attempting my first venture.
What ended up happening was that every health insurance company rejected me for having the pre-existing condition of asthma! It made no sense as I was very healthy and my asthma under control as long as I took a control inhaler everyday. The cost of my medicine would be way less than the premiums I paid -- but some actuary somewhere decided I was too high risk!
For 6 months, I was scared of getting sick or injured -- to the point where I was considering giving up to get a job just for health insurance. That thought to me was just so ridiculous and heartbreaking that I couldn't do it --I just kept telling myself that I had to make it to Jan 1.
I was overjoyed the day I got my insurance card -- it was a huge sense of relief. What brought me even more joy was knowing all my fellow Americans whom also could not get or afford insurance could finally receive it.
Today I no longer need the ACA -- our company is doing great, we're well-capitalized, and provide excellent health insurance to all of our employees. Without the ACA, this dream would not have been possible. We were able to create wealth and jobs because of the ACA -- it makes no sense to repeal it.
Even before I needed the ACA -- I had enough empathy to know that every person has the right to health care and one of the biggest reasons I voted for President Obama. When it affected me personally, it obviously hit even harder. The GOP's lack of empathy as well as a real solution to the problem are just infuriating -- it is absolutely shameful and disgusting how they are attempting to repeal this law.