
I Lost Faith in the Industry, Burned Out, but the Cult of the Tool Saved Me - curtis
https://habr.com/en/post/440914/
======
vinceguidry
I think F# just fits the way he thinks really well. I have that same sort of
Zen experience when I code in Ruby. Ruby's object model sets like firmament in
my mind and allows me to think about blobs of Ruby code in a discrete rather
than a continuous fashion. Which is what I think the author is getting at with
his praise. Abstraction verbosity golfed down to a minimum.

I couldn't even imagine giving up Ruby's elegant object model for the
verbosity of a static typing system. So when people tell me that Ruby or Rails
is magical, I'm like, yeah, in a good way. But the arcane correspondences just
aren't very accessible. If I want a functional programming model, I just code
one up out of the basic building blocks of ruby. If I want a type system, I
can make one.

~~~
melling
Don’t languages like F# remove much of the verbosity of a type system? In
fact, we’re finally loving away from that verbosity in general. Swift, for
example, lets me write declarations like this:

var done = false

let language = “russian”

let languages = [“english”, “french”, “german”, “russian”]

let dictionary = [1:"english", 2:"french", 3:"german", 4:"russian"]

The types are implied. The use of ‘let’ means immutable.

I believe F# goes even farther but the verbose typing of a generation ago is
almost gone.

~~~
wenc
This. Static typing doesn't mean tedium in modern languages. In Java and old
C#, you would write stuff like this:

    
    
      int x = 1;
      BigOldClass y = new BigOldClass()
      Dictionary<int, List<string>> z = new Dictionary<int, List<string>>();
      int[] p = new int[] {1, 2, 3};
    

In modern C#, you can write cleaner code like this:

    
    
      var x = 1;                  // type is inferred
      var y = new BigOldClass();  // syntactic sugar to avoid repetition
      var z = new Dictionary<int, List<string>>();
      var p = new [] {1, 2, 3};
    

Still strongly, statically typed, and obviously typed.

~~~
gbear605
This is also true in Java now

~~~
ma2rten
C++ also has auto now.

------
andersmurphy
Great article!

I had a similar revelation with Lisp and Clojure. Writing in a language you
enjoy using and are very productive in (effort->effect) is really liberating.

The great thing is even when I have to return to the old ways (Java) Clojure's
java interop makes writing the Java a lot more manageable, almost fun.

I don't know whether it's the functional paradigm, the dynamic typing (I
didn't have the same revelation with Ruby/JS), immutable collection by
default, the minimal lisp syntax, etc.

It just feels right.

~~~
iLemming
And of course surveys of recent years shown that the highest paid PLs are F#
and Clojure. Coincidence? I don't think so.

------
gambler
F# was one of the most frustrating languages I ever tried to learn. It sits in
this uncanny valley between OCaml and C#. I've had many, many problems where I
spent tons of time searching for idiomatic way of doing something only to find
out that there is none and I have to use "normal" .NET classes. The
documentation is pretty bad.

I find myself highly productive writing "mostly functional" code in C# using
LINQPad. The only thing that drags me down is that it doesn't have good
support for data structures that you can copy on the cheap a-la Clojure. The
paradigm of "copy the world on change" is immensely powerful. Maybe I should
look deeper into this. It seems that basic data structures for this wouldn't
be very hard to implement on my own.

I think the ideal language for me would have functional, strongly typed
capabilities for low-level operations and dynamic, late bound objects a-la
Smalltalk for high-level stuff. But for this to work well it would need to
have strong mechanism for versioning references, so functional parts don't get
contaminated with mutability.

Oh, another thing about C#. I really wish it had an ability to concisely say
"take an object, create a subclass of its class with additional properties,
instantiate it, copy all values from source and then set extra properties to
what I just provided".

    
    
      Something x = new Something { Property = "Hello" };
      var y = x.Expand(me => new { AnotherProperty = me.Property + " World" });
      Assert(y is Something);
      Assert(y.Property == "Hello");
      Assert(y.AnotherProperty == "Hello World");
      

Seems like a weird piece of functionality, sort-of-union-types, but it would
save me tons of code in many, many contexts.

I can implement this using reflection, but it will be slow and complicated and
not worth the effort. Maybe the new tuple mechanisms can do something of this
sort with minimal overhead and syntax. Need to look into them.

------
jondubois
>> ... programming in TypeScript every day.

That explains why OP got depressed, considered quitting the industry and then
switched to F#. If I keep using TypeScript, I might just snap and switch to
COBOL.

~~~
lucasmullens
Why the hatred of TypeScript? The vast majority of TypeScript devs tend to
love the language in my experience

~~~
whatshisface
> _The vast majority of TypeScript devs tend to love the language_

That sounds kind of like saying, "the vast majority of people with cilantro in
their burritos like cilantro."

~~~
akiselev
Due to _Javascript Stockholm Syndrome_ it's more like "the vast majority of
people forced to eat burritos at their day job like cilantro on their
burritos."

------
marvinalone
OP will ascend to the next level as a programmer when he realizes he doesn't
have to do all that enterprise crap in C# either.

------
foobarbecue
My bullshit detector was wailing at full blast reading this. The details seem
extremely exaggerated. I guess you could call it storytelling.

Maybe I'm just annoyed by his slight on public transportation.

~~~
ahaferburg
He has a .ru email, so I'm guessing he's from Russia, I don't know where from
exactly. I don't know anything about public transportation in whatever part of
Russia he lives, so why would I judge him about that?

~~~
foobarbecue
Good point! I probably rushed to judgement. A little more believable then,
that his car spontaneously caught fire and he walked home 10km -30C in
inadequate clothing when he had another option available. Also the corporate
corruption, the fake broken English, etc. makes somewhat more sense.

------
sandGorgon
Thank you for this article. The point is not F#. The point is finding a
philosophical fit with your code .. a kind of "Drift mode" (like the Del Toro
movies -
[https://m.huffpost.com/us/entry/us_3696719](https://m.huffpost.com/us/entry/us_3696719))

For me, it was Ruby. I have stopped writing Ruby code and have found other
languages that I love now (yes including Typescript), but nothing will replace
the enlightenment rush of Ruby.

I think all programming languages that exist today are a symbolic
representation of different kind of mental models that humans have. When you
find one that synchronises with your mental model, it's just magical.

------
xtracerx
I'm getting burned out on all the narcissists writing articles about how they
thought everyone else was an imbecile, and rudely raged at everyone most of
their career, and how great they are because they got slightly less cancerous.
Life is too short for that, if you love something, or have a technical
opinion, be a kind hearted teacher and discusser not a rage monster.

~~~
dang
This comment probably breaks the site guideline which asks: "Please respond to
the strongest plausible interpretation of what someone says, not a weaker one
that's easier to criticize. Assume good faith."

[https://news.ycombinator.com/newsguidelines.html](https://news.ycombinator.com/newsguidelines.html)

I didn't read it super closely but it seems obvious he's just using that
language as a form of self-criticism. No need to pile on. (Edit: also, I think
some of this is cultural differences.)

------
carapace
Did you ever read Flatland? Spoiler alert...

The thing about Flatland is the twist at the end, when Square asks Sphere
about even higher dimensions (than three) and Sphere is unwilling to consider
them.

(I guess what I'm saying is, if you like Functional Programming, try Prolog.
Logical Paradigm is even more useful than Functional Paradigm.)

------
turtlebits
I've been meaning to look into F# and this post gave me the motivation to do
so again.

However, trying to get up and running on a Mac, the documentation is horrible.
I looked at several of the official guides, including the Microsoft site on
how to get running with VSCode, and none of them worked without having to
search for the error messages.

Now that I'm up and running, none of the docs I could find would tell me how
to build/run a project.

It appears you to install the .NET Core SDK, and now trying to build a project
gives some ".NETFramework,Version=v4.6.1" error.

What a nightmare. I almost expected this since this is a .NET/Microsoft
related project.

~~~
AdeptusAquinas
Right now, there is a transition between net framework and net core in the MS
.net world, which causes plenty of confusion to newcomers. Which is sad,
because the clean, .net core way is the simplest thing in the world:

1\. Install the dotnet core sdk 2\. From a command line in an empty folder,
run `dotnet new console -lang F#` 3\. To build or run use `dotnet build` or
`dotnet run`

~~~
turtlebits
Wow, that actually worked. Wish those were in the official docs so I wouldn't
have wasted an hour trying to debug...

I followed the VSCode instructions and using "F# new project" apparently gave
me a .fsproj with the wrong TargetFramework, and after changing that, then got
a "Could not load file or assembly 'FSharp.Core" error.

~~~
AdeptusAquinas
Yeah, sorry. dotnet core to me has been an attempt by MS to not just get cross
platform, but also to rewrite everything to get rid of the old kludges. Simple
CLI, simple fsproj files, easy nuget, no differences on linux/osx/windows.

But there is still a lot of outdated docs out there. dotnet core has just come
too fast, imo (though I'm thankful). These MS docs are accurate:
[https://docs.microsoft.com/en-us/dotnet/fsharp/get-
started/g...](https://docs.microsoft.com/en-us/dotnet/fsharp/get-started/get-
started-command-line). Though it does specify the use of sln, which isnt
necessary for small projects.

------
BucketSort
I have been making a transition to be a functional programmer for a few months
now because similar concerns and stresses. I know that the programmer of the
future will construct programs like mathematicians do. The madness of the old
ways brings too much grief.

------
nickthemagicman
This headline sounds like it's from an HN headline generator

------
denart2203
Things never got so bad for me that I «lost faith in the industry», but I
definitely had the same reaction to F# as you did.

It just makes programming so much more fun — all the tedium is gone, it feels
like every character you write is actually important.

------
nbevans
This is a scarily similar story of how I ended up in F#. I'd reached the peak
of C#. Every possible best pattern and practice (including the ones that were
still a few years away) I'd already done them and perfected them. I was so
high up on the peak of the C# mountain that recruiters could no longer
understand me, employers could no longer understand me, co-workers could no
longer understand me. I could no longer function on projects and teams this
way. I ended up doing almost nothing except "R&D" for the teams I worked. None
of my R&D ended up in the product. I wrote specs, whitepapers, all sorts,
something to try to contribute. Nothing seemed worth the hassle. Toward the
end probably a couple months had passed where I'd made no commits, and had
barely typed a single letter into Visual Studio. I became an imposter and a
pretender - my self confidence took a huge knock. I quit and went back to what
I knew best. Building my own businesses with a trusted old business partner.
Some of the R&D I did in that last team was in F# and I chose to use F# in my
new venture. I directly attribute F# as having had literally pulled me out and
saved me from that year of burnout. And made me completely unlearn everything
that was wrong about software development and relearn it the right way. The
transformation took about 4 months and I'm now 5 years since that time and I
never look back. The thought of going back to C# and all that crap ... I think
I would rather earn money smuggling drugs or something.

I think the lesson is: If you get burnt out, try changing your tooling for
something more modern. If it ever happens to me again - I will try to have the
clarity of mind to do it again.

~~~
mr_overalls
> I'd already done them and perfected them. I was so high up on the peak of
> the C# mountain that recruiters could no longer understand me, employers
> could no longer understand me, co-workers could no longer understand me. I
> could no longer function on projects and teams this way.

Object-oriented programming has its drawbacks, of course.

But your monologue here is a bit grandiose. It reminds me of the narrator in
Zen and the Art of Motorcycle Maintenance as he reached the pinnacle of his
insight into metaphysical Quality. He was actually just going mad, of course.

Maybe you had communication difficulties with other people because you were
having a severe case of burnout that verged on a nervous breakdown? In any
case, I'm glad you're feeling better.

~~~
nbevans
"Object-oriented programming has its drawbacks, of course."

They say it takes 10 years to become an expert in anything. In my case, with
OOP, I did it in 6. I would highly advise to anyone that once you become
expert level in anything - don't hang around for long: make sure you've got
the next meal ready for your brain as it will hate you if you haven't.

Was not intentionally grandiose. The intention was to avoid superfluous detail
given the context.

Thanks

~~~
nbevans
Hi yatherm. Thanks for the comments. It is possible, after reading the OP
article and being caught up in the shock moment of "this guy's story is
identical to mine!" that I commented in a bit too much of a "Alcoholic's
Anonymous" style that is inappropriate for HN. Ah well.

