Hacker Newsnew | past | comments | ask | show | jobs | submit | ds_'s commentslogin

One of the many joys of working with Clojure https://clojure.org/guides/threading_macros


Not sure why you're being downvoted, because you're absolutely right.


The current top-10 billionaires on Forbes' list all got rich by creating value, though some like Larry Ellison certainly did both.


I don't agree. They didn't get rich by creating value. They might have created value, but they got rich by keeping that value to themselves.

I would also argue that they don't create the value themselves, but their workers do. Just like that joke: a worker is admiring the boss's Ferrari, and the boss tells him "if you continue working hard, next year I'll have 2"


I'm freelance, which means I'm my own boss working for a bigger company.

So do I fall in the category of being exploited, or do I fall into keeping all the value for myself?


> They didn't get rich by creating value. They might have created value…

Odd to contradict yourself with only a period separating the contradictory statements.

> I would also argue that they don't create the value themselves, but their workers do.

Sure, that’s fair - but those workers also have jobs and salaries because of risk the founders took to de-risk the company before the employees joined.

The level of risk required is not everyone’s cup of tea.


why pretend to have found a contradiction when a stronger reading of the comment is clearly that it meant to highlight the distinction between the creation of that value and its consolidation primarily into an individual's personal wealth?


Because it is paradoxical on its face. Many people like to argue that founders (or rich people, or billionaires, or whatever) don’t create real value, but simultaneously discount all the jobs they created and products they produced, because it is convenient to do so when it fits your narrative.

Yes, I’m all for co-op structures, but there is a big difference between “created no value” and “created lots of value but kept the majority of profits for themselves.”

If they’ve created 1000 jobs; is that value? Surely to those 1000 employed people, it is.


Remember Forbes list is a marketing device

Do not treat it like the real list of world's richest people


Yes these numbers are peanuts compared to the Rothschilds and Saudis of the world. But the question was about self-made billionaires, which I believe everyone on that list is.


I also create value but am not as rich. Maybe they extracted value from society by unethical means to acquire that much of it?


[flagged]


This is a breach of the guidelines (“please don't sneer, including at the rest of the community”), but it is also inaccurate. Most regular participants on HN are employees, not wannabe billionaires.


> Most regular participants on HN are employees, not wannabe billionaires.

You can be both and it would be interesting to see the breakdown of aspirations.

Certainly as the tide of public opinion has turned hard against tech and tech billionaires in the last 5 years, the dominant demographic on HN seems less and less aware of how out-of-touch they are with public opinion at large.


I read the comments here all day and it's pretty clear to me that overall opinion is weighted fairly strongly against tech billionaires and big tech company leaders on HN, as much or even more than it is among the broader population.

If you have a recent discussion thread or subthread that demonstrates that the “dominant demographic on HN seems less and less aware of how out-of-touch they are with public opinion”, I'd be interested to know about it so I can get an understanding of what you mean.

I suspect it's an assumption based on stereotypes about what kind of people would be interested in a Silicon Valley-based tech-focused discussion forum, but if it was ever accurate, and perhaps it was in the early days of YC/HN, it's not that way any more.


> I read the comments here all day and it's pretty clear to me that overall opinion is weighted fairly strongly against tech billionaires and big tech company leaders on HN, as much or even more than it is among the broader population.

I think you're out of touch with public opinion outside of your bubble.

> If you have a recent discussion thread or subthread that demonstrates that the "dominant demographic on HN seems less and less aware of how out-of-touch they are with public opinion", I'd be interested to know about it so I can get an understanding of what you mean.

This thread is a perfect example. While there is debate about the role and morality of billionaires, offline this phase has passed and now people are talking about how to overturn the economic order and the resulting impacts on billionaires, to put it politely.

> I suspect it's an assumption based on stereotypes about what kind of people would be interested in a Silicon Valley-based tech-focused discussion forum, but if it was ever accurate, and perhaps it was in the early days of YC/HN, it's not that way any more.

I suspect you are insulated demographically if you believe that's the case. I think many/most people's opinions of how to solve extreme wealth inequality would be banned here.


Please don't make assumptions like that. I don't live in Silicon Valley or even the USA. Almost none of the people I associate with socially or in my family work in tech. Much of the work I've done in the past decade has been with farmers. Most people I know are concerned about the influence of the big tech companies and emerging technologies on society and about wealth inequality, as am I.

> I think many/most people's opinions of how to solve extreme wealth inequality would be banned here.

Nothing is banned here if it's expressed in a way that is within the guidelines. I gather what you're getting at is that outside the bubbles that you think I (and the stereotypical HN user) inhabit, there's more of a push to, as you put it "overturn the economic order". I see plenty of support for that on HN too, and nobody gets banned for saying it. But perhaps it doesn't get much visibility, because "overturning the economic order" is not really a new idea. The thing we don't see enough of are workable new ideas on how to build an economic system that gets the best outcomes for society and avoids the pitfalls that have befallen all the economic systems that have come before.

Which brings us back to the beginning of this discussion: the reason comments like that get downvoted is not because "everyone spending time here is a one-off genius, superior to others that deserves to be a billionaire", it's because comments like that are repetitive, generic tangents that stir up indignation but don't raise anything interesting or new to discuss.


The execute function can recognize it as a t-string and prevent SQL injection if the name is coming from user input. f-strings immediately evaluate to a string, whereas t-strings evaluate to a template object which requires further processing to turn it into a string.


Then the useful part is the extra execute function you have to write (it's not just a substitute like in the comment) and an extra function can confirm the safety of a value going into a f-string just as well.

I get the general case, but even then it seems like an implicit anti-pattern over doing db.execute(f"QUERY WHERE name = {safe(name)}")


Problem with that example is where do you get `safe`? Passing a template into `db.execute` lets the `db` instance handle safety specifically for the backend it's connected to. Otherwise, you'd need to create a `safe` function with a db connection to properly sanitize a string.

And further, if `safe` just returns a string, you still lose out on the ability for `db.execute` to pass the parameter a different way -- you've lost the information that a variable is being interpolated into the string.


db.safe same as the new db.execute with safety checks in it you create for the t-string but yes I can see some benefits (though I'm still not a fan for my own codebases so far) with using the values further or more complex cases than this.


Yeah but it would have to be something like `db.safe("SELECT * FROM table WHERE id = {}", row_id)` instead of `db.execute(t"SELECT * FROM table WHERE id = {row_id}")`.

I'd prefer the second, myself.


No, just `db.execute(f"QUERY WHERE name = {db.safe(name)}")`

And you add the safety inside db.safe explicitly instead of implicitly in db.execute.

If you want to be fancy you can also assign name to db.foos inside db.safe to use it later (even in execute).


This is just extra boilerplate though, for what purpose?.

I think one thing you might be missing is that in the t-string version, `db.execute` is not taking a string; a t-string resolves to an object of a particular type. So it is doing your `db.safe` operation, but automatically.


Of course you can write code like that. This is about making it easier not to accidentally cause code injection by forgetting the call of safe(). JavaScript had the same feature and some SQL libraries allow only the passing of template strings, not normal strings, so you can't generate a string with code injection. If you have to dynamically generate queries they allow that a parameter is another template string and then those are merged correctly. It's about reducing the likelihood of making mistakes with fewer key strokes. We could all just write untyped assembly instead and could do it safely by paying really good attention.


But if someone omits the `safe` it may still work but allow injection.


Same is true if someone forgets to use t" and uses f" instead.

At least db.safe says what it does, unlike t".


Your linter can flag the type mismatch, and/or the function can reject f"" at runtime. This is because t"" yields a Template, not a str.

Template is also more powerful/concise in that the stringify function can handle the "formatting" args however it looks.

Note also, that there's no requirement that the template ever become a str to be used.


Not really, since f"" is a string and t"" is a template, you could make `db.execute` only accept templates, maybe have

`db.execute(Template)` and `db.unsafeExecute(str)`


agreed. but then you're breaking the existing `db.execute(str)`. if you don't do that, and instead add `db.safe_execute(tpl: Template)`, then you're back to the risk that a user can forget to call the safe function.

also, you're trusting that the library implementer raises a runtime exception if a string a passed where a template is expected. it's not enough to rely on type-checks/linting. and there is probably going to be a temptation to accept `db.execute(sql: Union[str, Template])` because this is non-breaking, and sql without params doesn't need to be templated - so it's breaking some stuff that doesn't need to be broken.

i'm not saying templates aren't a good step forward, just that they're also susceptible to the same problems we have now if not used correctly.


Then make `db.unsafe_execute` take a string.


Yeah, you could. I'm just saying that by doing this you're breaking `db.execute` by not allowing it to take it string like it does now. Libraries may not want to add a breaking change for this.


What does db.safe do though? How does it know what is the safe way of escaping at that point of the SQL? It will have no idea whether it’s going inside a string, if it’s in a field name position, denotes a value or a table name.

To illustrate the question further, consider a similar html.safe: f"<a href={html.safe(url)}>{html.safe(desc)</a>" - the two calls to html.safe require completely different escaping, how does it know which to apply?


The first one already exists like:

  db.execute("SELECT * FROM table WHERE id = ?", (row_id,))


But you have to remember to call the right safe() function every time:

    db.execute(f"QUERY WHERE name = {name}")

    db.execute(f"QUERY WHERE name = {safe_html(name)}")
Oops, you're screwed and there is nothing that can detect that. No such issue with a t-string, it cannot be misused.


Some SQL engines support accepting parameters separately so that values get bound to the query once the abstract syntax tree is already built, which is way safer than string escapes shenanigans.


I’d always prefer to use a prepared statement if I can, but sadly that’s also less feasible in the fancy new serverless execution environments where the DB adapter often can’t support them.

For me it just makes it easier to identify as safe, because it might not be obvious at a glance that an interpolated template string is properly sanitised.


> and an extra function can confirm the safety of a value going into a f-string just as well.

Yes, you could require consumers to explicitly sanitize each parameter before it goes into the f-string, or, because it has the structure of what is fixed and what is parameters, it can do all of that for all parameters when it gets a t-string.

The latter is far more reliable, and you can't do it with an f-string because an f-string after creation is just a static string with no information about construction.


> Then the useful part is the extra execute function you have to write

Well, no, the library author writes it. And the library author also gets to detect whether you pass a Template instance as expected, or (erroneously) a string created by whatever formatting method you choose. Having to use `safe(name)` within the f-string loses type information, and risks a greater variety of errors.


Documentation (and press releases/FAQs) are usually for users. Specifications are for developers. The former can precede and help with forming the latter.


Limits have been proposed for how many of these stable relationships it's possible to maintain: https://en.wikipedia.org/wiki/Dunbar%27s_number


It's only not a valid point of criticism if you believe any level of wealth is justified as it must be proportional to that individual's contributions to society.


I think that billionaires' wealth is justified, with the exception of criminal billionaires. Assuming that they pay all taxes that they are legally required to pay, why do you think that they do not have a right to their own personal property? They earned their property through voluntary agreements with other individuals.

A Warren-style wealth tax comes up surprisingly short in terms of funds collected for the government relative to the risks it faces ($2.75 trillion over 10 years, https://www.factcheck.org/2019/06/facts-on-warrens-wealth-ta...) The risks it drives include capital flight, worsened corporate governance, and decreased economic dynamism. These are all long term risks that are difficult to quantify. Most countries that have ever instituted a wealth tax have later repealed it. In every economic sense, taxing income is a better idea than taxing wealth.

Much of our understanding of wealth distribution is biased toward our home country. There's a pretty good chance that if you are an HN reader you are in the top 1% of income or wealth in the world (http://www.globalrichlist.com/). When I consider how little of the government's efforts try to solve global humanitarian problems compared to the Bill and Melinda Gates foundation, I tend to think that the Gates' charitable contributions do more to address income inequality than a wealth tax on Gates would have.

In many ways the charitable contributions by billionaires solve problems that the government is poorly equipped to solve due to collective action problems. Forcing any large-scale charitable effort to be redirected through the government risks stultification, political misappropriation of funds, endless bickering about policy goals, projects cancelled due to changes at each election cycle. Having a two-pronged approach of private and public charity is more robust.


> They earned their property through voluntary agreements with other individuals.

Employment is not a "voluntary" agreement for many people.


Let alone that sometimes problems and/or ways to solve them are... subjective to say the least. Or priorities are different.

It's OK to spend money without getting approval from the hive mind.

It feels like rehash of centrally governed rehash. If non-profit problem solving shall be centralised, maybe for-profit activities shall be done according by government-approved plan as well?


Why stick to billionaires though? There're lots and lot of people whose wealth is much bigger than their contribution to society.


"Simple is often erroneously mistaken for easy. 'Easy' means 'to be at hand', 'to be approachable'. 'Simple' is the opposite of 'complex' which means 'being intertwined', 'being tied together'" - https://www.infoq.com/presentations/Simple-Made-Easy/


I had a math teacher in primary school who used to shout with an exaggerated accent, "simple is not the same as easy!" She really wanted to drill the idea into our heads that just because you know exactly how to do something, doesn't mean that it will be quick or easy to accomplish.

Like, for a schoolchild, long division. The rules are simple, but given big enough numbers you'll probably mess up at least once. And then the same thing turns out to be true with algebra, geometry, derivation/integration, and on. It's not a bad mantra.


"It is straightforward to show that..." means that you could probably do it with your current knowledge, but it will take 6 dense pages, four false starts and about a week of focused work.


I used to joke that when a solution was known to exist the problem was "trivial"; when a solution was not known to exist it was "nontrivial". A problem that's bloody well impossible is "decidedly nontrivial".


If you were Feynman you'd even call it "elementary"

https://mavenroundtable.io/originalpath/path-helpers/feynman...


'You' being personified here, rather than the general you.

Straightforward tends to suggest we don't have to have a bunch of meetings about it, because the right person either has the knowledge or we know precisely where to get it.


It depends on the context. I had the math professor lecturing her students in mind.


Like the joke about writing math textbooks.

Forgotten the proof? Not a problem. The proof of this is elementary and is left as an exercise for the reader.



> I had a math teacher in primary school who used to shout with an exaggerated accent, "simple is not the same as easy!"

I can imagine no more poetic description of the experience of reading Wolfram's A New Kind of Science.


Can you elaborate?


Problem: Finely chopping food

Complex and Easy: Stick blender with chopper attachment.

Simple and Hard: Knife and cutting board.

-

Problem: Making a drawing

Complex and Easy: Computer and printer

Simple and Hard: Paper and pencil

-

Problem: Sewing lots of clothes (perfect stitches)

Complex and Easy: Sewing machine

Simple and Hard: Thread and needle

-

Problem: Software

Complex and Easy: Graphical User Interface

Simple and Hard: Command-Line Interface


> Problem: Software

> Complex and Easy: Graphical User Interface

> Simple and Hard: Command-Line Interface

GUIs are easy for the specific things the programmers made easy, and potentially impossible for everything else. The moment you want something the developers didn't put in the GUI, there's no recourse other than writing your own tool.

Command lines are harder to begin with, but modern command lines give you a gentler ramp up to writing your own tools.


Same is true with the other examples, I believe. Simpler tools tend to be the more versatile ones.


In all your examples, the complexity is hidden in the underlying technology, which I think makes them less than ideal. Sewing with a sewing machine is usually both less complex and simpler than sewing by hand. If you count the complexity of the hardware and the operating system and compiler, nothing in development is simple.

For me the dichotomy is better is better illustrated by: I need to create a new class that, with a few exceptions, does exactly what an existing class already does.

The easy way is to copy the existing class and make the small necessary changes in the copy. The simple way would be to refactor and put all the differences in delegates.


> both less complex and simpler

Did you mean "easier"? Because complex and simpler are antonyms, so it seems kind of redundant to use both words.

> the complexity is hidden in the underlying technology

The complexity is there. Maybe not all get involved with it, but it's still there.

> Sewing with a sewing machine is usually [simpler] than sewing by hand

The technology is more complex. The operation is maybe on par, though I would think it's also more complex. I may be biased in that I've hand-stitched many times and I find it super-simple, but I'm still a bit intimidated at the prospect of learning the basic use of a sewing machine. For very basic hand-stitching, you just put the thread through the needle, and the needle through the clothes in some pattern. That's it. For the sewing machine, I guess you have to lead the thread through some parts of the machinery, select some stuff through the knobs, etc. I think there certainly is a need to know a bit on the construction and workings of the sewing machine to be able to fix issues that arise.

> If you count the complexity of the hardware and the operating system and compiler, nothing in development is simple.

Complex and simple are relative terms, after all. If you refer to the last example of CLI vs GUI, they both involve the OS and compiler, etc. so that cancels out and we can refer to one as simpler or more complex than the other just based on the differences. Now, if you compare software development to making a sandwich, then sure, nothing in software development is as simple as making a sandwich.

> The easy way is to copy the existing class and make the small necessary changes in the copy. The simple way would be to refactor and put all the differences in delegates.

I agree to that, and that also aligns with the examples I gave. The complexity is mainly in how the thing is constructed. Duplicated code adds complexity to how the program is constructed. When you want to make a change to the common code, you have to make the change twice, maybe with a few differences. That makes development of the program also more complex.

It's the same as a sewing machine, or a stick blender with chopper attachment. Their construction and maybe operation is more complex than their counterparts.


I am yet to appreciate Rich Hickey's now famous "Simple Made Easy". While I agree with his points, I don't understand the significance of it. Simpler is easier than complex, right? Even the title said "simple-made-easy". What is the fuss about emphasizing "Simple is erroneously mistaken for easy"? They are not the same, but they are intimately related. Or is this an emphasis on relative vs absolute -- that relative simple can still be relatively not easy?

I don't think I misunderstood Rich Hickey, and I don't think I disagree. But I don't understand why people quote the opening sentence and feel so significant for them? To me, that is just a click-bate.


My takeaway was that if we conflate the two, we tend to use familiar (easy) tools to solve our problems, but that learning a new tool (hard) could result in a simpler solution.

E.G, passing something to a legacy program in a language I'm unfamiliar with from a program I wrote in a familiar language is easier than implementing my solution in the legacy language, but it's not simpler.

The 'relative vs absolute' seems like a heuristic to distinguish the two. Writing a solution in a different language is easier to me, but I can tell on an absolute level that there are more failure points to that approach.


Nice explanation. Python is a great example of this IHMO. It is a real struggle to get the Python programmers on my team to use any other language than Python.

Why? Because it's easy for them. But the solutions they create with it are highly suboptimal. They could be far more robust and expressed much more concisely and directly in other languages with more powerful type systems and better support for eg: functional concepts.

But they actually really think that because Python is easy for them, that it's "simple". It's not: it's incredibly complex.


Haha, I was thinking of that as I wrote it. My first language was C++ back in the day, then I dabbled in various languages for a while, and finally really dove into Python because there was a project I couldn't figure out how to write any other way. If I had to work with one of the languages I learned earlier, my first instinct would now be to write the solution in Python and pass it to the legacy program. Perfect example of what the speaker is warning of.


Thanks. I think I understand the background much better now. When we think easy, we always take the "my" and "now" perspective. When we think simple, we often take the wholesome point of view. Thus the need for differentiation.


I might be wrong, but I think the word you meant by "wholesome" is actually "holistic"


You are right, I just grabbed the words by the sound of it.

A better word is subjective and objective. Easy is a subjective word, while simple is an objective one.


> Simpler is easier than complex, right?

Well, no. Complexity has an obvious price but simplicity does too. You have to work for simplicity, even fight for it. Think of code; it just somehow becomes more complex. You have to work to pare it back to what's needed.

I can't think ATM of better examples (and you deserve some), but no, simplicity does not come easy.

A nice phrase I came across: "elegance is refusal".


Until you find a good example, I challenge your understanding :)

Similar to my response to another comment, I suspect there is a switching of subjects. It starts with a problem, and the subject is a solution to the problem. Simpler solution is easier to understand and manage. A more complex solution is more difficult. Is there a counter example?

Try not to switch out the subject here. For example, one may propose to use a library to solve the problem by calling `library.solve`. And then one may argue that the simplicity of the code is actually more difficult to manage as one need trouble shoot all the details/bugs/interfaces with the library. We should recognize that the library itself is not the same as the solution. The solution includes the calling the library and its details/bugs/interfaces/packaging/updating/synchronizing etc. And these elements interwine to make the complexity. So the solution itself using the library is not necessarily simple. It is difficult exactly because of the complexity.

As you can tell, I am essentially making the same opinion as Rich Hickey, which is `simple-made-easy`. And it is very far away from the click-bate opening statement of "simple is often erroneously mistaken for easy". A more correct sentence probably should be "simple is often erroneously labeled by partial".

EDIT: To clarify, I am not saying a solution using a library is more complex. It depends. With a library, the solution is layered and delegated. The entire solution is more complex and more difficult to understand -- if one is to understand every byte of it. However, the layering means not all complexity need to be understood for practical reasons. So with proper layering and a good judgement of practicality, the part of the complexity that you practically need manage may well be simpler (and easier) by using a library, or not. It depends.


I don't deny your right to challenge, but tight now I can't give an example. I've just gone through months of my posts looking for one particular post that might clarify but I can't find it. Not being able to search your own comments is frustrating. I'll have a muse overnight.

sorry!

Found it (thanks google): https://news.ycombinator.com/item?id=20591621 Simplicity was staring me in the face, it took weeks to find it.



Simple is easier than complex the same way that exercise is easier than chronic obesity. If you have the discipline to do the obvious that's great, but it takes willpower to create or do the simple thing. Oftentimes it's easier or more expedient to do the lazier easy thing in the moment, but you pay for it down the road. For example: I notice I'm doing the same calculation twice on the front and back end of my application. The "simple" thing to do would typically be to extract that logic to one place so that you don't end up having to modify it in two/five/twelve places down the road. But I'm already halfway through writing it, and the simplification will involve some non-trivial refactoring, so I take the easy route and write the same logic twice. It's easy for now, but will be complex when I have to change it down the road.


Modules are "simpler" than vectors because they have fewer axioms, but they are also much harder to understand. For example, not all modules have a basis, which can make them much harder to work with.

For background on the math, see: https://math.stackexchange.com/questions/137442/a-module-wit...


Good luck explaining "simpler" with modules and vectors :).

Simple is defined as not to inter-wine. To understand an axiom is to understand how it "inter-wine" with other axioms to prove certain results. So fewer axioms necessarily results in more interwines, ie complex. I think here we are switching the subjects: from axiom itself to the results that we want to prove. If we focus on the simplicity of proving the results, the simplicity of axioms are irrelevant.


Interesting analogy, but it's a little off.

The main reason modules are interesting is not as a generalisation of vector spaces, but because they are helpful in studying rings. Kernels of ring homomorphisms are ideals, which in general are not subrings, but they are modules - and of course every ring is a module over itself. So to study a ring R it pays off to instead study R-modules, since working with them is... you guessed it! Simpler.


The way I see it, when there's already a lot of complexity inherent to the domain (eg, software design), it's nearly always much easier to add to the complexity than to find a way to reduce it.


Your answer makes sense and is illuminating.

It is not easy to keep it simple.

The problem here is not that "simple is not easy", it is rather "picking partial and sacrificing/neglecting whole". Since one is only part of a team and a part of the whole design/develop/use circle, the "whole" problem is not (necessarily) "my" problem, therefore it is easy to pick a simple and easy solution from "my" perspective. The "my" and "whole" can also be swapped with "now" and "future". "now" is here but "future" is uncertain.


Good points!

"Parts:whole"?

That's where "local complexity : global simplicity" tradeoffs come into play; well-defined boundaries (coherent interfaces) are key to striking the right balance.

"Now:future"?

Yeah, YAGNI (You Ain't Gonna Need It") and STTCPW (Simplest thing that could possibly work) are good rules of thumb.

Finally, as for "not my problem"?

IMHO (and IME, 21yrs in the industry), that's a dangerously myopic stance. Those who make the effort to expand their perspective beyond the scope of their immediate tasks and responsibilities are those whose skills, powers, value and influence show commensurate growth. By all means, be a good team player and do your (current) job to the best of your abilities, which includes efficiency and ergonomics and awareness of available shortcuts. But if you do this for too longbe aware of the compounding effects, not only on the larger system's technical debt, but also the limits this may be placing on your career.


If you haven't seen this talk; watching it will make you a 10x better programmer. This is what I take for my definition of complex and it applies broadly in a very practical manner.


I've measured between 2x - 3.5x for every 12 minutes of a Rich Hickey talk. What's even more staggering is this continues even for repeated viewings.


>watching it will make you a 10x better programmer.

That sounds wrong. Can we drop this rhetoric?


What rhetoric? Are you confusing this with "the 10x programmer" meme?

Claims of becoming a 10x better programmer aren't claims about making one a 10x programmer. The former is about relative self-improvement and motivationally hyperbolic; the latter is about relative comparison to others, is often used negatively to belittle, and is detrimentally hyperbolic.


> motivationally hyperbolic

It's such a ridiculously high number that it ceases to be motivational.


I would defensively be more hyperbolic and use a different number, just because 10x is tainted by stupid ideas in programming. But your intent was pretty clear to anyone paying attention... that's just a high bar sometimes.


It's obviously hyperbole.


It needs to be rephrased into this:

"Watching this video will make you into a developer who is respected 10x more by their peers."


Would it?


Probably not, but it's fun to think about.

If respect is measured by an integer, going from level 2 to 20 is great. But if you have no respect, then gaining 10 times as much still leaves you at none.

If you are disrespected DON'T WATCH THE VIDEO unless you want to be disrespected more by a factor of 10!


No it's hyperbole.

However if you go from writing spaghetti code to something more structured (i.e. loosely coupled, however that is expressed in your language) then you're team mates will hate you less.


Well, no, but it will make you 10x richer.


harhar


Also: try out Clojure (... the programming language created by Rich Hickey based on this principle).


Was 100x for me. My boss unfortunately did not agree with me.


The speaker is Clojure creator Rich Hickey, but the talk is about a mental model for thinking about complexity.

Inherent complexity involves tradeoffs.

Incidental complexity you can fix for free.

"And because we can only juggle so many balls, you have to make a decision. How many of those balls do you want to be incidental complexity and how many do you want to be problem complexity?"

The article is about the former. I bet the latter dominates day-to-day line-of-business coding.

Highly recommend the talk, as other have said.


Simplicity is often a matter of perspective, a function of a certain perception of a complex subject and the set of expectations that go with this perception. There is no absolute in analysis and in modelling synthetic propositions from the atoms used by the particular analysis.

(E.g., we may analyse and model an action in terms of verb-noun or of noun-verb, with major differences in what may be perceived as "simple" in the respective model.)


> Simplicity is often a matter of perspective

Complexity was formally defined by Kolmogorov, using with Turing machines even. Hence, Simplicity is also objectively defined.


Referring to the above example of verb-noun vs noun-verb grammar: take for example the infinitive verb form. With the former (verb-noun) it's just the verb devoid of any context, simplicity in its purest, which is also, why and how it's listed in a lexicon. Looking at this from the noun-verb perspective, you've to construct a hypothetical minimal viable object, which will be also – as you want to keep things simple – the object every other object inherits from, the greatest common denominator of any objects that may appear in your system. By this, you arrived at the most crucial architectural questions of your system and its reach and purpose. While it's still about simple things, neither the task nor the definitions derived from the process will be simple at all. Nor is there a universally accepted simple answer, as a plurality of object oriented approaches may testify for. The question is on an entirely different scale and level for the two approaches. On the other hand, for a verb-noun approach, similar may appear for anything involving relations, which are already well defined in an object oriented approach. And, as you've arrived at these simple fundamentals of simplicity in your system, what may be simple or not in your systems will depend on the implicit contracts included in these definitions and how well they stand the test of time and varying use and purpose.


Later in the talk, he draws a distinction between inherent complexity (the focus of the article) and incidental complexity (which you can fix without tradeoffs). Tradeoffs can be critically important, but the latter kind of complexity probably dominates my day-to-day life. I find this oddly encouraging, in a free-lunch sort of way.

"And because we can only juggle so many balls, you have to make a decision. How many of those balls do you want to be incidental complexity and how many do you want to be problem complexity?"

Watch the talk.


On a related note, the late Patrick Winston strongly states in his MIT AI Course that simple is not the same as trivial. Simplicity is powerful.

Simple points may sound trivial and obvious, but simple things can add up to make something magnificent.


wouldn't say simple is the opposite of complex though? especially when talking about software systems or other systems in general. what i am thinking is that some complex systems can be made of very simple components.

the best example is our complex brain being made of simpler components working together. maybe the opposite of complex is chaotic? i don't know...


Simple systems can indeed be made of complex components; however it is a measure of interconnectedness. The key concept is that we can only hold a finite amount of complexity in our heads at any one time, and so if we can minimise that we can be more efficient and effective.

The analogy is a lego castle vs a wool castle. A lego brick is very simple and contained, and from this you can build wonderful structures; in addition if you wish to change out a portion it is easy to do because changing on part of the system (i.e. implementation) doesn't affect the rest so long as the contract between components is maintained.

Contrasting: should you pull on a thread in a wool castle it will affect other parts of the castle. A lot of software is like this, which makes it very hard to reason about.


"Interconnectedness" is also a measure of resistence to hierarchical decomposition (or factoring ax+bx -> (a+b)x); irreducable complexity.

One technique is redefining the problem, to smaller or bigger:

Work on only part of a problem, a subset, leaving something out. e.g. git's data model does not represent renames as first class constucts, enabling it to be disproportionately simpler.

Expand the problem, a superset, to integrate lower or higher level or associated parts that aren't usually included. Previously scattered commonalities may then appear, enabling decomposition.


And the Lego analogy works in particularly nicely considering just how much effort, precision and design work needs to go in to making the blocks simple [0]. This is a nice analogy for how keeping software components simple and making them interface cleanly is a difficult task.

[0] https://en.wikipedia.org/wiki/Lego#Design


> maybe the opposite of complex is chaotic?

Cynefin would agree!

https://en.wikipedia.org/wiki/Cynefin_framework


I imagine that a software system that is made of simple components can still be complex. So I'd still go for simple vs complex


A very big object can be made of lots of small objects, but that doesn't mean big isn't the opposite of small.


I think it's important to note that 'simple' can be used as an epithet.


They key takeaway that you should strive to be a simple person, not an easy person.



"Om Next is meant to be paired with Datomic" - although datomic makes some things easier, Om Next has no opinion on what backend you use.


ClojureScript can do this along with dead-code elimination / cross module code motion: http://swannodette.github.io/2015/02/23/hello-google-closure...


You mean the closure compiler can do this.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: