I think FP and OO are fundamentally different in how they approach programming: the way they break down problems, what they consider to be good code, and so on. OO views code as small unit of encapsulated state communicating with one another. FP views code as a series of transformations. OO code is not good FP code, and vice versa.
On a lower level you can find many similarities. OO patterns are largely FP language features, from a time when knowledge of FP was not very widespread. At least five of the Gang of Four patterns are first class functions is disguise. Going the other way, a very typical pattern in functional programming is to build up a description of what should happen, and then have an "interpreter" actually execute that description. These interpreters often look like "coalgebraic" structures, which is an FP term for ... objects. Now isn't that interesting?
In summary, the techniques often look very similar if you squint, but the fundamental way they approach programming is very different.
That's a very quick sketch, which is somewhat hazy on the details. Apologies for the brevity and lack of nuance.
The venerable master Qc Na was walking with his student, Anton. Hoping to prompt the master into a discussion, Anton said "Master, I have heard that objects are a very good thing - is this true?" Qc Na looked pityingly at his student and replied, "Foolish pupil - objects are merely a poor man's closures."
Chastised, Anton took his leave from his master and returned to his cell, intent on studying closures. He carefully read the entire "Lambda: The Ultimate..." series of papers and its cousins, and implemented a small Scheme interpreter with a closure-based object system. He learned much, and looked forward to informing his master of his progress.
On his next walk with Qc Na, Anton attempted to impress his master by saying "Master, I have diligently studied the matter, and now understand that objects are truly a poor man's closures." Qc Na responded by hitting Anton with his stick, saying "When will you learn? Closures are a poor man's object." At that moment, Anton became enlightened.
I was surprised at having come to a similar understanding after implementing a very basic OO system in Scheme some years ago.
 - http://c2.com/cgi/wiki?ClosuresAndObjectsAreEquivalent
A few little things I've identified that I do, that aren't totally mainstream:
- Don't reassign parameters, in fact, don't reassign things at all, if you can avoid it; show your work. It makes for more expressive code, and you'll have fewer bugs.
- Think of your code as doing "evaluation", not "computation". Code should take a bunch of inputs, do some stuff to them, and then return an "evaluated" response, vs. the viewpoint of "doing a procedure".
- Try not to make functions side-effecting. Avoid "void" unless you really need it, and really, really avoid distant side-effects.
- Don't be afraid to return a new object that seems "large" from a method. If you do it right, you'll mostly be copying references anyway which is pretty cheap.
- Share data liberally by reference all over your code.
- Don't be afraid to use a bit of recursion.
On the other hand, I'm not afraid of a little grubby OO now and then, especially when dealing with I/O, file handles, network streams, etc.
All to say, I think the two styles are about 90% compatible but there are some parts that don't mesh well. I'm not afraid to mix them, though.
As I mention in the opening I do not think there is a strong dichotomy between functional and OO programming. I believe historical accident created "Objects vs functions", and by historical accident I mean Java. It is unclear to me why would you not allow to create plain simple functions and force everything in objects. Probably a misunderstanding of "everything is an object".
Famously Alan Kay emphasizes "message passing" as the key characteristic of object orientation. Because every discussion about OOP and functional programming eventually ends up talking about State as the main discussion point, I fail to note how a definition of OO based on message passing contrasts the benefits of functional programming around state management.
In fact the way I see it is that when we have more units communicating with each other they form a system that should be functionally pure from an external point of view but can be OO in its internal implementation.
EDIT: Continuing my train of thought: the problem with OO in it's current common form is that objects often/always leak details about their state. So you have a tuple (state, [actions]) where often using an action is invalid given the tuple's state.
OO makes code understandable by encapsulating moving parts. FP makes code understandable by minimizing moving parts.
I think they can be used in a complementary manner. One area where functional thinking can be a benefit can be in code that is tested with a lot of mocks. Instead of having a bunch of objects that mutate state and that need to be mocked out, model that part of the program as a series of pure function transformations of data. It will be much easier to test and reason about.
For a long time, lambda-calculus has been seen by a lot of programminglanguage researchers as the foundation of programming to which everyother paradigm has to be reduced. This research tradition producedmuch work on encoding object orientation (whether class-based orobject based) into lambda-calculus. Ideally such encodings should besound and complete. That has proven difficult. In parallel, functionallanguages acquired OO extensions. The first serious implementation tomake this (sort of) work was OCaml.Arguably, all that work wasn't quite convincing. Eventually, it becameclear that lambda-calculus isn't the basis of all other programmingparadigms. Instead people tried the reverse: encoding lambda-calculus intoobject-orientation.
Scala really nails this, and validates your intuition that there isn't a dichotomy. Instead FP is a special case of OO.
If you want to understand the relationship between OO and FP there isno better way at this point to learn Scala and study howlambda-calculus (both at program and type level) is encoded intoclass-based object orientation.
I think an understanding of state is fundamental - one thing that brought this home to me was a talk I watched given by Sophie Wilson [https://en.m.wikipedia.org/wiki/Sophie_Wilson] in which she displayed an image of a cpu. The image showed a 'path' across the cpu that was the current state, the next image showed a different path describing a different state. The path was a lot like a bolt of lightening.
An understanding of functional programming (FP) matches this a bit more directly than OO as FP is a pipeline of functions that describes state change and it is easy to reason about the state at any point in the pipeline. OO represents a real world object so you are encouraged to think about the problem you are modelling rather than the how to represent different states. But obviously in the end they both describe state and logic that describes state transition.
https://www.cs.utexas.edu/users/wcook/papers/OOPvsADT/CookOO... is a paper that argues them as complementary to one another. It's worth reading in its entirety, but an excerpt from the conclusion:
A detailed analysis of the trade-offs involved must be made in order to choose whether an ADT or PDA ["object"] is better suited for a problem. Some relevant questions in this choice are: How likely is it that the system will be extended? Must the security of the system be preserved, even at the expense of extensibility? Is it possible the unforeseen interactions may be desired? Is the environment dynamically extensible, and must the additions interact in complex ways with existing code? How much efficiency is required? Is it likely that there will be a large number of binary operations with complex behavior?
In general, ADTs tend towards tight coupling, yielding more predictability, performance, etc. Objects tend towards looser coupling, allowing more flexibility and extensibility. This is a reasonable microcosm of the relationship between FP and OO.
"Functional Programming Principles in Scala"https://www.coursera.org/learn/progfun1
"Functional Program Design in Scala"https://www.coursera.org/learn/progfun2
(There are two more free courses in the "specialization" - only the certificates and the capstone project cost money - original announcement http://www.scala-lang.org/blog/2016/05/23/scala-moocs-specia...)
FP emphasizes immutability. So in OO + FP, objects are treated as immutable data. Functions create new objects instead of modifying the same object (avoiding side effects).
For convenience you can create functions to access parts of an object instead of creating new objects to achieve the same.
It's also why you have Greenspun's Tenth Rule, and why there is probably a Smalltalk corollary for FP languages. You eventually need to be able to solve both halfs of the expression problem.
In general, objects are supposed to be processes (in the general sense, not necessarily OS processes). Some of those processes might be equivalent to full Turing Machines, but most will be much more limited; it just depends on what kind of formal grammar they recognize, which is key to understanding objects: They are just processes that accept some input and dispose of it as either code (something that is translated and executed) or data (something that is stored and forwarded). Crucially, in either case, objects do work by responding to messages. This is why Dr. Kay says that the actual big idea of OOP is message passing.
Once I learned to appreciate real OOP, I realized that there is actually a natural simpatico between FP and OOP rather than a dichotomy. Consider that if you're doing real OOP, you're going to end up designing lots of little languages and then implementing interpreters/compilers for them. Well, it turns out that it's comically easy to build compilers and interpreters using statically-typed languages like ML (F# in my case).
Now days, I use F#, C# (immutably w/o setters), and SQL to simulate a language that recapitulates what I think is the real power of Smalltalk/OOP: It can rather directly simulate the process of scientific progress itself. I now find myself designing classes that represent falsifiable statements (e.g rather than a class 'SearchEngine', I'd have something like 'LowLatencySearchEngine'). Just as scientific progress is often concomitant with theories and models that have ever more symmetry, so it is the case with the graph of classes that describe my system: I somehow end up with fewer central points of failure. For instance, in the case of 'SearchEngine' vs 'LowLatencySearch' engine, the latter made it apparent that my class should be initialized with a set of search providers, and that it should keep latency statistics (thus being able to falsify the proposition). The end result is that the proposition represented by the class naturally contraindicates that I should rely on one search engine.
There's a lot more to say about this, but the last thing I'll mention is that FP languages like ML teach you that there is a difference between a class and a (static) type. The big idea is types correspond to logical propositions (the so-called Curry-Howard Isomorphism), but I naturally ended up there just by trying to more effectively simulate the process of science, which brings us full circle to Alan Kay's big idea: computers can simulate any process, they can even simulate better computers. I would argue the scientific process is the best computer of all.
- OOP code is usually separated and organized by the principal data it operates on, i.e. the instance of a class, and more specifically the instance's fields.
- FP code is usually separated and organized by the more abstract or philosophical responsibility of the functions, and they may not always share the same arguments.
In general, privacy by obfuscation is an idea that privacy researchers have been considering. Other than TrackMeNot, however, I haven't seen many real-world applications.
Of particular interest to your question are the threat models.
You would need chaff deliberately constructed to look a bit like non-random social network/communication data; that's kind of a research project, and its going to be hard to guarantee it is working in the face of unknown statistical attack.
It kind of reminded me of the old Asynchronous Transfer Mode protocol, with its cells.
I have a high tolerance for trawling through documentation and reading the code of open source libraries in pursuit application logic and the fiddly bits of related services. I have low tolerance for the same work in pursuit of infrastructure configuration and systems administration.
I run various flavors of Debian and Ubuntu across a desktop, 2 laptops and a home server (various audio/video projects). Thus I tend to default to the familiarity of these systems, and get back to the part of the stack I enjoy working in. Another word for this might be "laziness", but that doesn't quite tell the full story.
edit. And oh yes, the memory usage of the default installation is so low, that you can virtualize dozens of them on your laptop. This helps when you want to locally reproduce the stack you run in cloud.
I also use it at work. The scale is much different as one of the largest CDNs, the network interface stats are eye popping. This is proprietary caching software and nginx and apache for certain types of origins or admin services.
Back then fbsd had something called accept filters, which basically made the accept call only return when a http request was received in the network buffers.
Systems running fbsd loaded up different than Linux, kept being responsive. On same hardware, could do 3-5x more rps with lower load iirc.
As my applications at the time became more cpu bound, I switched to Debian around 4.11.
I've recently been using 10.x, coming back to fbsd from 10 years of Debian. I love what you've done while I was gone. Especially binary packages and easy upgrades, but especially jails and zfs.
I don't buy into the "increased performance" though. Every well done benchmark I've seen is at least several yaers out of date, and my personal benchmarks usually put linux ahead on any sort of operations that include networking. Not to say FreeBSD doesn't perform well, it does.
Simplicity is key.
Default system uses less memory than Ubuntu (~50MB last time I checked which means something on .5, 1GB RAM instances). I could swear memory consumption in general has fallen down, but haven't done any measurements.
I don't have to jump all over the web to figure out how something works - I just go to handbook. Which means one gets tendency to study topics instead of copy-paste snippets from around.
Since base system (maybe things were different before) does not abruptly change or pull the rug under your feet, combined with handbook studies, this has the effect of compounding knowledge that'll be effective in years to come.
Firewall (pf) is a thing of beauty. I've barely scratched the surface of it.
Base/userland abstraction split, as well as consistency throughout the system helps one maintain a solid mental map of the system. After a short while, you just know where stuff is, how to configure it, and where its defaults are even when you're in completely new territories.
Bonus: You can really go the distance without compiling anything, but if you're keen on maintaining a low memory profile by dropping various features from your packages, this is a great new build system I use to have all my pkgs up to date - https://github.com/jrmarino/synth
One thing I really like about it besides the things others have mentioned is that by default it sends emails every day/week/month regarding security and system usage statistics, so it tells me when a security vulnerability has been found for a package I have installed and that I should upgrade it.
I've found this makes me much more likely to keep things up to date.
It works fine, but Linux is probably ok too. There's some things you need to tune if you're high traffic -- most of them are sysctls you can tune at run time, but there's a couple boot time values; basically if you have enough ram to do webserving at 10gbps, some of the auto tuning for network buffers are going to be oversized, you'll likely actually allocate that much during peak, and FreeBSD won't return free'd network buffers to the overall pool; so you can't just drop the per socket sysctls, you need to reboot with lower network buffer caps (and per socket buffers, probably too). Depends on what kind of traffic you're serving though, and I'm guessing a lot of people won't hit 10Gbps out anyway. There's some other minor tweaking of that nature required too; and I would suggest running 10.3-RELEASE, if possible, there's some useful bug fixes in there.
Migrating to FreeBSD for both dev and server work is on my personal roadmap for around June / July this year, once 11.0 is released and my laptop chipset is supported.
Linux also seemed to have changed quite a bit since the last time I used it in the 90's/early 2000s. With systemd, it doesn't seem like Unix anymore.
I also looked up recent Linux distributions to use, and was largely overwhelmed at the choices. I looked up FreeBSD, and it was just one distribution.
I still enjoy programming, but there's a lot of "Keeping up with the Tech Jones's" with constant new flash in the pan API's or frameworks and not a ton of just "get shit done", and BA's/managers with minimal technical experience making decisions on what you have to do is the rule, not the exception, and it seems a little pointless after awhile.
Like I could be replaced by someone else and the work would still get done, so what value am I really adding to this? At least in video games I had creative input on the look, feel, and design of the game. In corporate dev I've had almost zero input, except sometimes in how the data is structured (which doesn't excite me anywhere near as much).
As a child, I loved computers. I taught myself 6502 and x86 assembly languages, as well as some other languages. When I got to the university and actually understood how digital circuits worked, I was so fascinated. When I finally landed in Silicon Valley, I felt like I was in a dream. I was good at what I did and I met awesome people who were good at what they did. Actually, the greatest pleasure was meeting and working with people who were much smarter than I was.
Eventually, the thrill wore off. Id seen so many bugs and new projects that they started all feel the same, kind of like my personal version of the film Goundhog Day. I didnt love it anymore. And then later, I didnt even like it anymore.
At one point, I calculated my net worth at a few million dollars and realized that I could just quit my job and live off the investment interest. So I just did it. Ive been retired for four years now.
I travel a lot, which was something I couldnt do much when I had a job that only gave me three weeks of vacation. I can also travel in a different way: taking the time in a new place to see un-touristy things, meet locals and study the language a bit. I read a lot of books, none of which are about computers. I havent been back to the United States in over a year.
Thanks to my frugal habits and the runup in the stock market, my net worth is higher. My burn rate is under 2%, which means that I can do this indefinitely. I dont miss Silicon Valley and will never live there again. In fact, I probably wont ever live in the United States again. And I dont miss my cubicle one bit.
What I did is unusual. But the thing I dont understand is why it is unusual: most of the professionals I worked with could have made the same choices and had the same result. I guess they found more enjoyment in the cycle of work and consumption than I did. And like most people who lived in the Valley, I knew and had friendships with people who were far richer than I was: whose net worth was $10M or $30M or more, who could retire today and have a very comfortable life anywhere in the world. But they continued to work. I can only guess that they found more enjoyment in work than I did.
Only time will tell whether this is a sabbatical or a career change.
But ... I get rejected for every job I ask : I don't have diplomas. The bread I see on average are at best and as good as mine, my alcohol is cheaper than market and tasting better, my reparations are clean... but I don't have diplomas and the conforming education...
So I am looking back at coding, and I still hope I will find whatever is not a modern job intoxicated with all the current hype in IT or financial or web agency or startup spirit.
Wish me luck, it is tough but I am still going and as long as I can I will try.
Also, there is the delay option in your profile, which does sort-of work to give you a preview (although it is a bit of a clunky way) https://news.ycombinator.com/newsfaq.html
All modern web application stacks run as well on Linux as they would on OS X, if not better, so there is no advantage to running OS X and lots of downsides.
You need to run OS X on Apple hardware, and they haven't made a blade server for several years, so you'd be stuck with either the mini or the Mac Pro, either of which is going to be expensive for the computing resources you get. You also can't fit them neatly into an enclosure.
Also, if you ever wanted to move your infrastructure to the cloud you'd need to move to Linux anyway.
I can think of no valid reason to use OS X server to host any kind of web app.
Running it on non-Apple hardware is legally questionable at best (the EULA forbids it, if this part of the EULA is applicable in your country is a question for a lawyer), Apple doesn't do server hardware anymore, it costs money and you don't get support or special software from Apple for server-usage for it, and since nearly nobody runs it as a server OS it probably isn't very high on the priority list to support that usage for other software vendors or open-source project.
A lot of things probably will work well since they are made to run for developer usage, but if you do not absolutely need integration with something apple-specific or just want to reuse an old mac lying around for a hobby project it doesn't give you anything over other OSes as a normal web server.
And not directly what you asked, but a thread that comes to mind is this one, where an unnamed company (presumably Mathworks) built a rack of Macbook Pros for testing purposes.
An entire colocation facility that runs Mac minis. It looks fun.
We have no interest in scaling on OSX and plan to port to linux. It's an interim type of thing.
I really like OS X, I've been using it on my personal and work computers for 9 years. But for server sit is Linux all the way.
We've since abandoned this practice as there is no Apple hardware suitable for it. We still run some Mac mini servers for things that do not run on any other OS, but definitely not web sites/apps.
I definitely don't have millions of users, but there are hosting companies that do mac only. You can ask them if they have large clients.
(My needs are a node.js based site on virtualmacosx.
I had written something locally on Mac, and it depended on things that OSX did different than Linux, and decided I didn't have the time or inclination to fix it, so went with VMOSX.)
Why do I do this? Well, it lets me have an anonymous web experience overall. I started it when I needed a way to test work I was doing but making sure that it was a "clean" experience. e.g. I didn't have something loaded or cached that would mess up my testing or the results. Then over time I figured out it is nice too because if someone needs to borrow a tablet for something real quick or needs to look something up I will hand it to them and I have no worries over anything they might see/do.
If I was doing security work, I don't think it would stop me from having a smart phone, but it would depend what type of security work. If being anonymous and hidden was the goal, I sure wouldn't have a smart phone, or any permanent phone for that matter.
My need is to have a glanceable schedule for the day - what is coming up, when and where; or how packed the day is or not. Calendar notifications don't work for me as I need information at the back of my mind. Having a widget displaying information without me seeking it out, helps my back of mind scheduler.
Now thinking about it, Widgets (atleast for my case) acts like an ambient device.
Some internal company ones giving quick KPI/dashboarding. I think this market is under-served by corporate apps in general. If a process is critical to an organisation no matter it's size, a widget can be a great tool for monitoring it.
When a real-time statistic is sufficiently important I prefer a widget to needing to load (or even develop) a dedicated app. I can then go through unified web-based (responsive) interface to take any action needed.
What I have used instead (but not much ) is the OneNote badge. It works kind of like Facebook "conversation bubbles", giving me a shortcut to OneNote from any app.
I perceive them to use up battery and memory and I don't want the unnecessary distraction. Whether they actually do use battery or not is another question.
I used to use a wifi/BT/GPS toggle widget but all that is now in the notification drawer there's no need.
There are not a lot of information you need to have always up to date.
Blatant promotion: My company is hiring more people for the same position. We're a very small company and we build apps for hospitals and healthcare providers around the world. Email us at firstname.lastname@example.org for more info :)
These seem to be the typical salaries for what I've noticed from web-based companies in Toronto. And I think it's on the low side. Developers should be paid more.
* Intermediate level (2-4 years): $70-85K
* Senior level (5+ years): $90-120K
I started at $40000. After 1 year, I'm now at $53000.
I both live and work in Toronto.
The stack would have been a PHP monolith moving towards small/polyglot microservices with an Angular front-end component.
The numbers compared to my current employment in Cambridge, UK seem fairly similar, I believe living costs are pretty similar too. Not all of us have the ability, or the desire to move to the US!
I encourage you to take employment in US, if that's a possibility for you.
When I worked for a Toronto firm (1.5 yrs ago), I made 96k doing Angular. Now, I do remote consulting and it's very difficult to find anyone in Toronto willing to match what I currently make. Highest I've seen from a recruiter is 150-160k for a CTO role.
I haven't examined alternatives too closely, but I get the sense that I'm approaching the top end of the salaried pay scale around here (GTA).
$150k base, up to 15% bonus.
Not too far from downtown Toronto
Works out to taking home 5200 CAD per month.
The other side of that coin? The pay as a developer is FUCKING SHIT.
Best strategy is to get paid in USD and live in Toronto.
Database as a service works just like any other managed service today.
IBM Cloudant can scale-out to many servers that are all handled by IBM. I'm sure a lot of other cloud based documentdatabases can do this too.
Regarding why it hasn't become really popular yet organizations are generally very slow to change their data storage solutions. Changing to nosql from a relational database also requires a large rewrite of the system and it is not only upsides of going in this direction (some says that it is almost only downsides). It is for exmaple usually harder to get acid guarantees from a distributed db and it may be harder to create (secondary) indices.
That's really only possible if the DBaaS is a "thin wrapper" as you describe.
But, other than that, I think ronreiter is right -- there are DBaaS that have big user bases.
But if you host your frontend, it doesn't make sense to talk to a database in a different datacenter when you could instead put it in the same rack.
I think the "obvious solution" is just not super easy to implement. If you want ACID compliance as with traditional RDBMSs but in a auto-scaling, distributed setting, it's not going to happen. Early RDMSs were built with a single node in mind, and any database-as-a-service will have to make some compromises. DynamoDB gives you the flexibility of not having to worry about scaling, and even offer strongly consistent reads, but without support for transactions, for example.
Once you do that, things like instances/nodes/hosts become important because you cannot abstract certain consistency requirements away from them.
Secondly, globalization without universal cultural appreciation has done a lot of damage to what we could consider our collective human heritage. A great dream would be to have schools that rotate around the continents, so that students/scholars/people would be exposed to the best of what other parts of the globe have to offer. It would forward-leap humanity a lot if there were simply better crosstalk between tribes.
Thirdly, the emphasis of education should not be to create/fuck/produce/consume but to actually emphasize co-reliance of beings, species, environment, nature. We cannot exist without our planet, and although we can drive fast places, most people do not realize at what a cost this simple luxury comes. Sure we can advance and make up for some damage, but not making damage in the first place is generally the best idea.
I suppose my main beef is that education is not looked upon as a topic worthy of evolution, when it is in fact the head of the inch-worm of humanity-at-large.
Having them do this at the expense of play (accelerated self-guided learning through social simulation, art and sports), at the expense of physical activity and in an insanely toxic social environment, is plain crazy.
Apprenticeship, where one learns what they need to learn when they need to apply it, and then uses the newly learned skills to achieve own goals beats that hand down. Look up Tobi from shopify and his posts about his learning to write software in Germany's apprenticeship programs.
Convincing kids that they are smart or stupid based on their teacher's opinion on the kids' obedience and ability to regurgitate uninteresting (to them) data is harmful at best. Convincing them that what they are experiencing in school is learning is even more harmful.
Schools are great at efficiently enacting a plan that has little to do with children's needs and little to do with learning.
Like a close friend who attended an elite private school with tiny classes and a lot of self-elected subjects, time allocation and projects said, "when I went to college I thought I was surrounded by idiots. Later I realized these were kids who didn't get a chance to learn good writing, or public speaking, or to plan, schedule and execute on their own nprojects, or to navigate bureaucracy."
I'd say same goes for other important life skills, like financial planning, media preparedness (understanding propaganda and advertising), job hunting, entrepreneurship, art, etc.
That said, these problems are widely known and discussed. Alternatives such as Montessori education are becoming more available. Most American 18-year-olds are reasonably numerate and literate; some even manage to pick up some scientific, historical or foreign language knowledge as well.
In hindsight, the weirdest thing about it was how difficult it was to find suitable times to go to the bathroom.
To add some context to what I mean, the current system is largely based on the decisions of the Committee of Ten. If you read that short note, you'll notice that it's pretty much applying the lessons of industrialization to education ie. assembly line approach.
The example of the assembly line approach is especially relevant for me because I don't think that it is applicable to humans. Different humans learn at different rates so it doesn't make sense to group them by age. Additionally, teaching everyone the same things, while making things nice and uniform, takes away the biggest motivation for learning - curiosity.
This is completely anecdotal, but the further away I moved from this assembly line education system (from high school to college, from college to self-taught developer) the better grades I got (college) or more money (work) and the more time I spent learning, even things that are unrelated to my main focus because the world is fascinating.
As for an idea on how to fix this, I admit that I don't have a concrete one. I've skimmed the topic and the thing that drew my attention most is the Montessori system system of education. It proposes a few points relevant to what I wrote in the previous paragraph, but also one that I find particularly interesting to developers: "Uninterrupted blocks of work time, ideally three hours".
: https://en.wikipedia.org/wiki/Committee_of_Ten: https://en.wikipedia.org/wiki/Montessori_education
And even still, today's education system might be the best there's ever been . . . most people learn how to read . . .
This doesn't address higher-education, which is a whole 'nother shit-show . . .
1/ Dividing kids in age based groups is very poor. They only learn negative behaviour from each other. Skill based would be more interesting as the younger kids would learn from the older students and the older ones learn some responsibility towards the older students
2/ Scientific research has proven teacher based education to be sub-optimal. You take away the inquisitive nature of the kids. They will take what the adult says as true and fail to look for different ways to reach the same goal.
3/ School just isn't fun. Information is pumped into children which they forget once it has been tested. Let them discover things in a playful way and they will remember it much longer.
4/ Exams really only test how well one can game exams and tests, not how well one understood the matter. Test should be used as a personal measure to check if you understood everything and if you are ready to move on to more complex issues, not as a benchmark compared to others.
And so much more.
Further to that, instead of focusing on minimalism and utility, each subjects goes to depths far beyond of what most kids need to know to make use of. Lo and behold, they're going to forget majority of it in a month. And some subjects have gone completely off the rails, like English, with the main focus on past literature. That's not what natural languages are most used for. Arguments, public speaking, legal, journalism, marketing. These matter day in day out, not what Shakespeare spewed while he was high on an Autumn afternoon. That's fine too but let the kids do it on their own time and focus the efforts in equipping them with critical thinking, etc for when they enter the wild!
Education is about making up what is important for us as a society. If we are to allow million of people to starve and get convince that what we see is just a natural state of affairs, then we have defined education as a system not about us as a society but about you as an individual. Society must speaks out with their pockets: If you are paying low wages to scientist, teachers and doctors, you are educating people about what to do with their lives. Forget about the shiny words, education is a lot about economic, incentives and giving people a decent life. Education can't be build without a framework and a clear purpose. Today all of us know what is the purpose of education: save yourself, stay alive, survive. The rest is just a hollow mud of words, deceitful, vain group of vacuous words.
In this forum virtual reality can be turned into a platform for education. We can use virtual reality to replace opium and get people sideway of our way, that is convert into passive, sleeping minds.
But otherwise, we could transform virtual reality into a platform for action, were people are actively engaged into learning and helping others to create and promote knew ways of learning and discovering what is being a human being in the 21th century.
We all want feedback, learning is about communication for action not for self-oppression. I am for an education for action. Now, go, ruin the idea, sell the product, crook the intention, ban the action and feed the vultures and continue educating for succeed.
It's very possible to perform very well on tests with minimal actual comprehension of the material through memorization. In fact, it's quite possibly easier to memorize solutions than to actually learn to solve them.
Back in the early 1900s, and even through a significant part of the century, teaching was nearly the only place for graduates of top women's colleges, at least until they got married. Upwards of 90% of employed graduates of these schools were teaching. Whether that was a matter of it being the most respectable or the most lucrative thing for women to be doing, the fact is that it had a pretty great talent pool to work with. By the 1980s/90s, when you looked at the top 10% of women in terms of academics, only about 10% of them had any interest in teaching as a profession .
Now, both the money and the respect are lacking. The perception is that any idiot can become a teacher as long as they can make it through their four years of college. Some people will be quick to say that you can't teach for the money. While that's certainly the case in the US right now, and it agrees with the overall notion that it's much better to be in a job you love, it ignores a lot of the problem. Top students, when they pick what area of studies to pursue, are bound to think about the prestige and earning potential of their future careers, though the amounts of those will differ for different people. If you could easily be headed for a job where you'll make upwards of $100k, accepting $40-50k is a lot for some people to swallow. Suppose I think I'd really enjoy teaching, and hopefully even be good at it, but asking me to be unable to retire for ~40 years, versus the 7-10 I can manage otherwise, is a bit much. Even if I'm not doing my ideal job, I can afford some hobbies that will make up for that. I like sailing, skiing, and traveling, and I'd like to get my pilot's license. Teaching isn't going to pay for any of that. So I make my trade-off, reducing by one the pool of potential teachers. And there are a lot of others doing the same thing.
I have many more things I could say, but I should wrap up my rant. I also believe that home life has an enormous influence on school performance, and I think land use patterns in the US increase this effect by reducing community cohesion, and along with it possibility of parents who struggle being assisted by the people around them.
 Somerville College Report, 1987 and 1996. (I've used statistics from Oxford here, but the trends are similarly mirrored for US. I just don't have a resource handy.)
Garbage. An almost complete waste of time and energy. For grades K-12 a lot of it is just babysitting, to give kids a place to be and keep them out of trouble while their parents are at work. I value my primary school education very little.
While I wouldn't go so far as to say that college is a scam, I would say it is often one of the poorest financial investments people make, and it's even worse because we trick naive 18 year olds into doing it. College is not for you to find yourself, and it's not for you to waste time pursuing a degree that can't help you support yourself and pay back the insane amount of debt you took on to go there.
The current generation of kids was told that you need to go to college or you'll be a failure in life. My dad constantly was saying that if we fucked up and didn't get into a good college we'd be "Making hoagies at Wawa". They say your major doesn't matter, it just matters that you have a degree - you can figure out the rest later.
It's a shame no one sits kids down and says - "Hey, you're about to take out one of the largest loans of your life, one that you'll have to pay many years, maybe even decades. Why are you doing that? What career do you want? Will this degree get you there? What can you expect to earn with this degree - can you pay down these loans with it? If your loans are X, you will be paying at least Y a month."
Most people I know did not get a talk like that from their parents, or high school teachers/guidance counselors. I wish they did.
Some things to improve the current system:
1. Not every kid needs to go to college. Are you bad at that book learning stuff? That's fine - push more kids into trade schools.
2. In the upper grades of primary school, focus on teaching kids the things that will actually matter and are useful. Financial things - how to do your taxes, how to use and maintain a budget, how to pay your bills on time. Life things - applying for jobs, finding an apartment, what careers pay best and how to get into them. Civil rights - how to protect yourself from the police. Real life things that will actually benefit them.
3. Encourage kids to do community college for two years then transfer to a real college to save money. The "college experience" isn't worth the price most pay.
4. Hammer it into kids' heads that unless you're going to MIT, Harvard or Yale, where you go to school doesn't matter. Your degree and the field you choose to go into matters a lot more. Require all colleges to provide what the average jobs and starting salaries are for all majors before a student is allowed to pick one.
Education is important, but the system we have today sucks.
We can't fix education without fixing the rest of society. The system is so complex and inconsistent, we simply can't expect a kid that keeps what makes him good (curiosity, honesty, idealism) to thrive in the real world.
The solution is to preserve curiosity and honesty. These are the only traits that matter.
Technical writing is often cold, fact-based writing. There is the need to be 100% correct and caveat explicitly where necessary.
Technical articles also should assume to require a user's attention, and popular articles deliver a quick fix.
Promoting the use-case for a product isn't technical writing, it's marketing, providing clearly linked outcomes to causes/problems/opportunities that an audience should be aware of (should be).
I had a quick look at your blog, for example 'Solve All Your Cryptography Problems in 3 Easy Steps'* The title is popularist, implying a quick-fix for readers that need a quick thirst-quench. Not that business, as it isn't quantified. A bit like a 20 second page-view blog post.* The content is not. It is long and quite detailed. But now I'm thinking, so who's the audience? If the audience is 'business' write to them with appropriate diagrams and do link to much more highly technical implementation and justification - using external references can help a lot here.* If the audience is implementers, stroke the technical side. How it is not hard, exotic or difficult, but is interesting, well supported, and could also gain some credit if they used the material to bring a business case themselves.
Improve the quality of the writing: Split your audience into buckets of people with different needs, and address those needs.
About learning Photoshop: Forget that. If you want more diagrams, do them in PowerPoint, export as a PDF, then export from Acrobat as an image. Absolute zero learning curve.
A few thoughts below. For context, I was a technical writer at Red Hat before spinning out the content tool I cofounded. I'm the cofounder of Corilla, a publishing tool for technical writers... Corilla is like Github for content teams (http://www.corilla.com).
When asking for peer review, you will mostly get people pointing out a few minor things and moving on. Doing in-depth reviews are really hard, so it's just human nature to find a few things to comment on and fulfil that emotional contract.
Building up a small circle of very close collaborators for peer review is very helpful. But it's hard work - for example I'm in Boston this week, and I made sure I did a deep-dive on a new content deck sent over from another founder from our NUMA accelerator alumni in Paris. Pay that ^&$& forward first.
Technical writing versus marketing
A long time ago in a galaxy far, far away, technical writers openly mocked sales and marketing. Then something called "Google" happened, and writers that didn't take the time to appreciate that every page is now page one suddenly found their career prospects shrinking.
Technical writing is a very specific art, but one that is broadening widely. I look at "technical writer" in the same way as "full stack engineer". The oldskool days of learning dry and emotionless technical writing were kind of like an engineer getting down with LAMP. Ditto how IA and HCI has blossomed into UX.
The best technical writers understand the power of their content and how it intersects with the needs of the reader. And some of those readers are making purchasing decisions. So you can either argue about "technical writing has become content marketing", or you can learn as much as possible to improve your ability to write the right content for the right persona at the right time. Right?
Personally I hate them and avoid content because of them. Unless I encounter them because of a trusted referral in my network. Or if the body content is enough to drive my user journey towards that content.
Your case will depend on your target demographic. Are they inclined for clickbait titles? Are they mostly referred by trusted sources/social media? Are they driven by google (or, lol, Bing)?
I worked with a manager once that was proud that they never watched videos and hated graphics. That was a great experience, because much of the universe is the opposite.
I can list off a lot of figures that support the conversion/retention/activation power of these other forms of content, but it's 2016. We don't have to. It's not even a debate anymore.
The challenge is that they ALL work. Most of us grew up reading MAN pages, right? So what? A good technical writer has to and loves to test the content preferences of their users.
I wouldn't suggest you learn Photoshop necessarily. You could use Freelancer/Upwork to get some expertise in. If you want to DIY, get a design buddy (or pay a few bucks on Upwork to get taught) how to use Sketch and Marvel/InVision. The design space is shifting quickly.
Get better at technical writing?
Join the Write The Docs community. Seriously. Eric is probably reading this thread right now (g'day!), and they are just a wonderful global community of diverse technical writers. The WTD conferences are super sweet too.
Hope that helps. Ping me directly anytime, I live in this space and love to help.
(I'm the founder, happy to answer any questions you have)
There is no limit on # of passwords or # of users with the base license and has full Rest API support.
It's git friendly and supports having separate GPG keys for different credentials.
You can either use the free hosted service by passopolis, or host your own.
disclaimer: not affiliated with either of those, but was a happy Mitro user and then switched to Passopolis (and am still very happy to use and know the project lives on).
 https://passopolis.com / https://github.com/WeAreWizards/passopolis-server
 https://www.mitro.co/ certificate expired)
In one of our latest projects we decided on following stack:
Backend/API: PHP, Symfony3, Mysql
We choose this because the following reasons:
The team is already familiar with symfony/phpWe had to integrate with existing stack/business logic in php ( or port parts of it )
We needed a single page app that we could easily port parts of to a mobile app later onWe wanted to decouple our frontend from the backend by doing only api calls so we avoid having backend code responsible for generating html/etc
Real-time component: Node.js, Redis
We needed a component that processes events as they come in, and a lot of them. We decided against PHP so we could lower our memory footprint and also because it is a bit more convenient to deal with state.
This component checks each incoming data packet with a set of rules and reports on violations.
This component gets it's configuration from the backend api and reports back to the api whenever a violation occurs which needs to be logged.
And those tools today are often a mix of my own code and some SaaS.
Depending on how much data management there is, I will ususally start with Django, specifically Django Cookie Cutter .
This bootstraps a lot of the basics for me like user auth, testing, front-end assets, etc.
For error console, I will use Sentry. There are self-hosted and paid versions.
If I want some real-time type functionality, I will use Pubnub 
I am lazy and will always play to my strengths. That happens to be Python, Postgres, and constantly hunting tools that make me an even lazier developer.
 - https://github.com/pydanny/cookiecutter-django
 - https://getsentry.com
 - https://pubnub.com
I would use Rails. Rails has everything I need to build a web app and API back end should I require a native mobile app. As a ruby guy I can't really comment on the frontend, but my go to JS framework that lets me build shit quickly is knockoutjs.
In the future I want to use the following setup: ASP.NET Core with Angular 2 and Typescript. And then host it on Azure. Sounds like a golden combi.
My current stack is JavaEE on TomEE.
I'd probably happily sacrifice verified stack compliance for the latest TomEE 7 milestone build as I understand the verification issue is just Oracle being Oracle again, throwing a wrench in the gears just because 'why not'? Or rather to see if they can somehow extort some money from an open source project. </rant>
If it's just you, and a first outing, then a minimal set of whatever you're most familiar with. For me that would be nginx -> wsgi -> flask/bottle or similar -> postgresql, because python. Similar if you're more comfortable with ruby, js, whatever. Build out from there if it becomes worthwhile.
If you're a group, whatever allows the group to make best progress.
Haven't used but wish-list to try next: Docker, GraphQL, and probably try hosting it on google cloud platform
If the use-case fits, even wanna try a Firebase-backend only app as well
Backend: PHP (Yii2), Mysql, Redis
Frontend: React (if I can't get away with just JQuery), Bootstrap 3
Realtime components: Node.js, Socket.io
Personally, I would go for Flask just because it's so easy to build up momentum due to the minimal setup required.
Database: Postgres and possibly Redis
Frontend: Not much of a front-end person so I avoid all the complicated stuff and stick with Bootstrap. I also tend to prefer coffescript
Hosting: Lambda via Serverless for API, S3 for HTML/assets
API: Node/JS via TypeScript, Postgres RDS, GraphQL
Front end: React
Haskell yesod and elm for fun
It's not robust and won't handle edge cases gracefully, but I've used it for a few hundred PDFs and they all worked.
The big downside is the slideshare slides are images, so the PDFs aren't searchable - they are just images.
But at some time, my C64's tape recorder broke. And I couldn't save the programs I wrote. So, programming to me was, waking up in the morning, start writing some program and playing with it, and in the evening when I switched off the power button everything would be gone. But I loved to play with my C64 :)
At those days, sometimes I even wrote very long programs. But I must admit that, when I see those 322 lines, it really frightened me now! It's looks like a million line C or Java codebase to me. I have no intention to refactor that code at all.. But I agree it would be fun.
Recommend you port it to Python, as a command line / console app. Command line would make it simpler to keep the "spirit" of the original.
I understand that higher education isn't there to teach you VB or Java but to teach you the principles... but IMO it certainly wouldn't hurt if there was some connection to real life.
I came in as someone who had already coded a while. I was best in class in several subjects IIRC, helped others but felt like I could never have a career in Java.
We were never taught how to work efficiently. Or rather: teachers actively restricted access to sane environments.
Code was supposed to be written in an old unsupported text editor.
For many of us this very smart idea teachers has about teaching things "from ground up" has the nasty side effect of demotivating many of the best students to the point where you consider doing something else.
I never even dared to apply for a Java job and only started after being picked up. I remember telling my first boss the truth: yes, I have been coding since I was a kid and yes I have passed Java in school but I cannot program it. Luckily he gave it a try and with good colleagues Java soon became my personal favourite.
I learned the fundamentals of Ruby on Rails with Michael Hartl's tutorial and built an e-commerce application on Heroku from scratch (html/css/js/jquery/postgresql) It featured an admin panel, inventory management, user accounts and a reasonable RSpec test suite. It took me about 3 months of plowing 90hours+/week. I used it as a portfolio application to start looking for jobs. After blasting hundreds of resumes (>600), I got about 20 interviews. None of them worked out except for two unpaid internships which I financially could not accept.
I gave up Rails, but I didn't give up coding, so I asked the internet what was more likely than Rails to land me a job? iOS was probably more niche and more in demand. So I spent a month learning the basics of iOS development with Swift and released 2 apps on the App Store over the following 6 months (build-learn-build-learn cycle), both using Parse, Firebase and a panoply of 3rd party APIs. They were well architected (imo) using fundamental OOP principles, as well as the classic iOS patterns, singleton, observer etc.
This time I sent over 3 thousand resumes over the course of 5 months, all over the world: Canada, USA, Mexico, UK, Australia, Netherlands, Germany, Argentina... you name it.
I got 2 remote pair-programming sessions, which I nailed, I also got about 8 coding assignments, which I completed within hours of receiving the instructions (4 of which never even had the decency to respond or give feedback). All in all response was the same. I even got a couple of absolutely ridiculous contract offers such as building a full fledged real time web and iOS landlord/tenant management system for 2000$, solo.
Without trying to start a pity party, I am now doing manual labor on a curtain assembly line, going door to door after my shifts trying to sell Wordpress websites, which are easiest to setup and sell.
I guess I had to stop coding because I couldn't find a job, because it takes up time I don't have and even though I am passionate about it, passion doesn't pay the bills.
I wrote about this in article a little while ago if you're interested in the full process I went through. Note (I didn't choose the title for this) - http://www.gadgette.com/2016/02/19/how-i-learnt-to-code-in-a...
I am a programmer and I have a lot of patience for that stuff. But I don't why I do, because objectively speaking it's crazy to spend hours ingesting this kind of ultra-specific, non-reuseable information.
1. Learned to code some C# in an attempt to distribute some of my simulations to other computers. Had a great time and managed to get something good enough up and running.
2. Tried to pick up Haskell because I liked some of the ideas, and had a few projects I was interested in trying to do in a functional language. Had a bad time and quit after ~2 weeks. The environment and tools were garbage. I thought the old by-engineers-for-engineers software I used to build research models was user-unfriendly, but I guess that was just because I had never tried to work with the software programmers build for each other.
I worked through ~20% of "Learn Python the Hard Way", then later, the intro CS 101 of Udacity which has a Python intro, as I wanted to be able to do more then vlookups and complex workarounds for Excel sheets.
My new career is in marketing automation, so I did some tutorials online, and bought a SQL book to pull PL/SQL queries for data segmentation. I also picked up HTML/CSS, but don't have any reason to really use Jscript. I can read it, and trouble shoot in some landing page uses, but I don't need it.
Learning to code was always a supplemental goal for career growth, and I find it fun. I was that IRC guy who loved scripting simple tasks like a music player/displayer, k/b wars, etc.
However, when I'm actually diving into learning actual code, I don't enjoy it. I don't think I'm built for it, just as I don't grok statistics, yet my sibling is a actuarial scientist, but he gets confused about things that come naturally to me.
Being in Marketing Automation, its more relevant for me to do "continued" (outside of work) education not in coding, but in platform research (Eloqua, HubSpot, Marketo), more SQL/data management (I am reading "Object Technology: a Manager Guide), and certifications in these platforms.
I viewed coding as a means to an end. Learn to code-->start a business-->get investors-->pay someone else to code. I didn't care much about what I was learning, only that what I was learning could potentially fulfill other goals. That, in and of itself, wouldn't necessarily deter someone from learning how to code, only...
I struggled learning through on-line tutorials (Code Academy et al). It's not how I learn. That was unfortunate, seeing that coding community spearheads this type of learning. I realized that if I wanted to make it work, I'd have to register for a class. Then I became scared that maybe the struggles wouldn't persist past on-line and I'd be financially committed to it. I wasn't willing to take that risk.
Codecademy did a good job though and http://www.theodinproject.com/ too.
EDIT: Also, the job prospects did not look too good because of the fierce competition. What motivated me was doing my own apps/sites (lego for grown-ups), or at least work on a startup, but the required resumes were really daunting. Sysadmin just didn't have the rockstar flavour to it (I think it's a fine job, just trying to convey the fact that a certain air of adventure needed to be present to lure me to stick with it- i.e. the same reason 13 year olds learn the electric guitar).
The primary reason I gave up was that I wasn't willing to accept the amount of effort which needed to be put in to get the level of results that I wanted. I just couldn't comprehend that the skills I wanted to have required years of commitment.
The advice that I'd give would be to understand that this is a huge task. You won't learn everything quickly; even if you're very bright; even if you spend 14 hours a day on it. Those things will help, but they aren't the key.
If you want to be a good programmer you need to love learning. It's not about being clever, it's about being persistent. You constantly need to learn new tools and frameworks, and occasionally new languages. You need to understand the technologies you're interacting with and how they work. And you need to take all those tools, frameworks, languages, and technologies and use them daily.
But mostly you need to invest the time.
Don't give up if you let a big project go because it's too difficult, or don't understand something, or spend two weeks on something you thought would take an hour. Be disappointed, sure. But don't quit.
Keep going. Keep learning. Keep on picking up just a small amount of knowledge or skill each day.
In a year things that now seem complex will be obvious. And that will happen again and again every year that you continue learning. Eventually, your failed projects will turn into completed projects, but it could take years for this to start happening depending on how ambitious the projects were. You can't let that stop you. You just have to keep going despite it.
So keep going. But realize it's a long, slow, life-time commitment to constant learning. It's not easy. Even if you've been good at everything else in life, there's no exception for you. Mastery and skill will only come with significant time and effort. But they will come.
Also learn vim. That sh*t is awesome.
Through out these years it's always been a struggle to learn to code and finish something. I've done some basic problems, some Project Euler, etc. I did countless tutorials, it just doesn't stick for me. I've been through so many languages that I can't even remember them all, name it and there's good chance that I've read a book on it.
It also seems like there is so many tools and programming today is so convoluted and over engineered that I just get overwhelmed. I also don't have anyone to talk about programming, I am just spinning wheels solo and get frustrated when I get stuck.
Right now I am giving my last chance of learning to code. I found out Lisp and eventually Clojure. It seems more straightforward and simple, there are no 'design patterns' to remember and break my head with. I feel like I can slowly build something from bottom up. I have high hopes for Arachne upcoming framework. I hope it will be accessible and I'll be able to make SPAs sites.
But yeah, I feel like I've burned out on this. I just get frustrated with code most of the time when I can't come up with a simple solution.
I progressed from there to medicore competency in PHP, rails, and c++. Then I went to university to study comp Sci...but almost immediately switched to aerospace engineering, and my coding skills plateaued.
By that I mean I can write basic stuff in all sorts of languages, but I'm miles away from writing a compete program or anything user friendly. Most of my code these days revolves around automating various things in the most sensible language. Where sensible often means something the next non-coding engineer to come along can understand.
I guess I stopped because I knew enough to do what I currently need to do. I'm content that, given time, I could learn to be a better coder. But at the same time I avoid jobs in my industry that are suited to decent coders because I know there are more suitable people for the role.
Every so often try to pick up some "hobby coding" but find that I don't really enjoy it like I did as a teenager.
The reason it clicked was because at the time, a colleague offered to mentor me. This helped since he would assign me cases related to my skill level, show me how to ask better questions, and explain how things worked in context to our tech stack.
I tried many of the free options out there but whenever I hit a roadblock I just quit because I had nothing to lose. I paid $30 or so for a swift course and never stopped because I had paid money. It's a tiny amount of money but I felt like I had to see it through since I paid money. I now have 2 apps in the app store, with another on the way this week likely.
I find myself particularly struggling when language walkthroughs get to libraries and code organization. Follow all the paths and dependencies is really tough for me.
Now the good news is that you don't need to use TDD. Tests of any kind do make a difference, even if you have to write them after you've coded up a solution. Tests should be testing the most important parts of your application or the trickiest parts. Tests are there to give you confidence that your code does what you think it does AND to ensure that you don't accidentally cause regressions. If your application wasn't built with testing in mind, use test data or use a BDD tool like codeception.
I don't find TDD to be necessary but I do find tests necessary. It along with automated deployment can increase the quality of your code by an order of magnitude.
I don't particularly enjoy TDD, where you write the tests first. I do enjoy what I call test-oriented development, where code doesn't get merged without tests, and automated testing is how you verify any changes before committing them (though for UI and workflows you should always have an acceptance testing stage). It goes a long way towards making me feel confident in my code; it gives me a structured point in my workflow to consider what the edge and corner cases might be and how to deal with them; and it often helps me catch and verify fixes for subtle (or not so subtle) bugs much sooner and with a lot less effort than click-throughs would.
Edited to add: you say you spend a lot of time mocking databases and such. I usually plan to have a DB available for testing. Django in particular makes this easy by building an empty DB scheme for each test run and running every test in a transaction that gets rolled back so that the DB is in a known state for the next test. Some things you may just want to use instead of mocking, especially if they don't require running an additional process (sockets seem like an example of that to me, depending on what you're doing with them).
For other interfaces (especially third-party web APIs), look for libraries in your language that will let you mock requests, specifying responses. If there isn't one, build one for re-use, use it for all your projects, and release it open-source. That'd be a great way to earn some visibility in your ecosystem.
I was kind of giving up on TDD but seeing that almost everyone thinks it is important (for larger projects), I will try to watch some more videos and try to write tests for my current project (for the work already done) and tests first for the code that hasn't started (maybe I'll add comments in the tests). This way I can compare the two, with which approach suits me better and fails more (i.e. catches more bugs) in future.
However, I have written code without it and I frequently find that when I do so, I very quickly regret it. Either I get confused about what precisely I'm doing or I end up having to write tests after-the-fact and it is much harder. The barrier is worth overcoming. How?
1) Find good tutorials and work through them.
A lot of people say that the best way to learn something is just to dive in and build something. I disagree, at least when that thing is new to you. I find it is much better to find a tutorial that guides you through building something the first time. It is worth asking around on twitter or on a relevant subreddit for this. Then, don't just read--actually work through at least a good chunk of it. Once you've done that you have some code you can look back on when you are looking for the basics of how to set up your tests.
2) Don't worry about mocking as much in the beginning.
Also note that TDD doesn't really work if the code is already written because doing fine-grained tests for code that is already written is really hard. It is better to do interface/API tests and put off unit testing until you are willing to refactor the code.
Note also that there are some tasks where your tests are going to be more like infrastructure tests and your changes won't be quite as granular as TDD doctrine dictates. That is something you have to accept when everything is coming together, because that is the realm of integration tests.
There is a tutorial I've written which aims to teach this alongside teaching configuration management, though it is my first tutorial. I would love critiques of the pedagogy and example code. https://amfarrell.com/saltstack-from-scratch/
My suggestion is to use KeePass and store your database in a zero-knowledge, self-hosted cloud with end-to-end encryption (and also secure it with an offline private key).
If setting up that cloud storage sounds like too much trouble, SpiderOak is a good centralized, zero-knowledge service.
As for it being censorship, this event is not properly comparable to the government censorship of speech in China. Read http://www.paulgraham.com/say.html if you haven't. In the US what you can say is restricted through informal, "softer" means like social pressure, which would make it like most places if not for the fact that American cultural institutions are the most powerful in the world; those institutions, in turn, have a complicated relationship with the government. Briefly, American billionaires like Thiel have nothing on the American media or universities in terms of their ability to influence what people think. Government, media and academic opinion form a feedback loop.
There is (thankfully, of course) no Great Firewall of the United States but in practice American thought rarely deviates from the government-approved norms.
The troubling part is that we have someone secretly using money to manipulate a case in which he is not a direct participant.
Wealthy people should not be able to weaponize our legal system.
Thiel funding a lawsuit against a website that specifically wronged him is so mild that it's just not worth getting upset about.
To me the story seems to be that Gawker was wealthy enough to crush libel and slander lawsuits for years. But in the end, there's always a bigger fish.
Assuming the legal system is just, I don't have a slightest problem with whoever funding or managing a lawsuit, revenge-seeking or not.
And comparing an invasion-of-privacy (or libel and slander) lawsuit to opaque state censorship is a huge stretch.
Now he is going to get stung.
2) Use WordPress: just pick a simple, one purpose theme and avoid bloated ones (ie ThemeForest). It requires a LAMP/LEMP stack.
3) Ghost is an alternative blogging platform with minimalistic and usually well designed themes. It runs on Node.js.
4) Pick one of the many static site generators based on the language of your choice. They require no database and only need basic static hosting: https://www.staticgen.com/
I by all means don't think this is 'professional', but I doubt what you want to make would need much more work than I have done.
These days there's resources for everything, webservers which have really good proxying if you want to code in a language other than php or manually writing html, pre-made 'article-writing software' in many languages made for the web.
Tools? All you'd need is notepad, or nano (or, your preferred text editor)! You shouldn't need to run compiled code for the web, in my opinion, as there's no noticeable speed differences.
Googling for specific things in a specific language will probably give you results, e.g. 'nodejs blog' will land you to Hexo, which really neat, customizable, and fast.
 https://avail.pw https://hexo.io/
On the lowest effort end, squarespace is a pretty decent option for getting something that looks nice up and running quickly without needing to deal with server stuff. It works for several colleagues, but has some flexibility limitations.
The next step up would probably be a Wordpress installation either on your own server or the lower-effort hosted solutions from wordpress.com. Personally I can't stand wordpress (it's become immensely bloated and keeping it updated and all your plugins/themes/whatever in sync and playing nicely can be a pain), but it works well for a huge number of people.
After that you're looking at rolling your own custom page on your own server, maybe a simple themeforest template on a shared host. I don't recommend this approach these days unless you're itching to get your hands dirty with some code whenever you want to update something.
I use Dynamic DNS and a lamp(hp) server hosted on a Raspberry Pi.
This cost me a total of $10 a year + trivial Electronics costs.
My site consists of 0 interactive parts. I have no use of a database . It only lists work that I've done, Often linking out to GitHub repositories.
- html theme from themeforest
- amazon s3 for hosting the static files
- linked a domain
- used formspree.io for the contact form
Not much traffic, couple of cents a month. I don't do much updating too. Worked well for me.
You can use a CMS template to make it blog like, lets you do nice formatting no cruft.
Here my use of it (need to do some updating, been a while):http://www.portcommodore.com
Heres a good example page:
Then there is Github pages and some people have created template repositories that you can clone or fork that look rather nice and are easy to post content to if you just learn Markdown which takes five minutes
However if you need an intro page I would suggest wordpress, they have a hosted one too, incase you don't want to deal with server stuff.
p.s My site https://snehesh.me is built on react and nginx
I'm a dev and would doing it if I were not such a cheap bastard.
Luckily we don't move a lot in this business. I might type slightly less quickly than most people (though I am actually quite a fast typist, I think it's slowing with age), and I might make more typos (thank goodness for IDE's which help correct things like that!) Ultimately I can code all day without much problem at all. Maybe other engineers are less tired at the end of the day, but who knows? I can only judge how I do based on my own experience.
The one big problem with Parkinson's is that it can have cognitive effects. I have read that it can cause dementia and other issues. This could obviously effect coding.
Anyway, I am glad to answer any questions.
Since those numbers are so low, there is right now a team at the Cleveland Clinic which recruiting for a much larger study (100 people total) that they're calling CYCLE: 40 people with PD will do forced exercise on a motorized stationary bike in the lab, 40 will do voluntary exercise on a normal stationary bike in the lab, and 20 will not be directed to exercise at all in the lab:
This is right now still in the recruiting stage so it probably has a couple years before it yields results; but if your friend can't live in Cleveland for a year, you could try to find another way to keep yourself at the 80-90 RPM levels, whether tandem biking with your friend or else by jury rigging a motor or perhaps even self-discipline.