1,262 karma · joined March 6, 2013
This makes me wonder why this hasn't been used in more cases... I have been messing around with parametric 3D models using regular 3D vectors, but getting to the bottom of this might make my life a lot easier.
> Elm has an incredibly powerful type system
Near the end of the article:
>Want to decode some JSON? Hard, especially if the JSON is heavily nested and it must be decoded to custom types defined in your application.
IMHO the lack of typeclasses/traits is really hurting Elm. Take haskell f.e.
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics
data Person = Person {
name :: Text
, age :: Int
} deriving (Generic, Show)
instance ToJSON Person
instance FromJSON Person
While I understand Evan's aversion against complexity, it makes me a bit wary about using ElmLang in production. I am currently using TypeScript, but if I would need a more powerful type system, I would probably switch to Haskell/PureScript or OCaml/BuckleScript instead.Setup a customised website/landing page directly targeted at these people from your home town and try to get their attention and feedback. Be polite but determined: send an email, call over the phone and meetup.
Selling a generic product nobody knows is hard, so try to become #1 in your vicinity for a certain niche, and make sure all your marketing material is focused on that niche. Once you're the reference in that niche expand vertically or horizontally. Repeat ad infinitum. Combine your outbound marketing with proper inbound marketing, and after a while you'll gain traction and leads will start dripping in slowly but consistent.
Don't offer free trails, but tell them they can get your product at a reduced rate forever. Free customers are hard to convert to paying customers, so charge them something (even if it's peanuts). You can always upsell later.
Gradually increase your prices for your new customers as you expand your market. Keep old customers at their old price; it will take them feel special and reduce churn. At the perfect price point people will complain it's too expensive, but buy anyway.
After you've done this (I'd assume it will take anywhere from 6 months to a year) you will probably already have a long term vision in how to proceed.
Regarding the marketing part: if my own start-up learned me anything, it's that great marketing can launch a mediocre product, but if you have mediocre marketing, your product will need to be extremely good to gain any traction.
TL;DR: business requires hard work, and shortcuts usually don't work. Outliers and survivorship bias apply to the posts that claim otherwise.
I just think: based on what I know now, how long would it probably take to write it - optimistic -?
Multiplying this by 3 is justified by the unknown unknows, bugfixing, communication, changing scope and assuming stuff is more simple than it actually is.
Works like a charm for me in most cases.
For problems where the solution is still unknown, I tend to break it up in small cycles, with a best-case estimate. At the end of every cycle we adjust and align, so that the customer can decide for himself whether to proceed, restart or abort.
Pure gold!
While I understand that 2-way binding might complicate everything, it is the one feature I need the most when setting up a quick-and-dirty prototype. IMHO this might be the deal-breaker...
The hardest part is changing the mentality of the team, but within a month or 3 you usually ignite the spark that gets everything back on track. Getting to the first tiny win that changes the status quo requires a lot of hard work, but once that's rolling, it's only a matter of making yourself redundant.
One caveat: the bottom-up approach works best when people introduce you as the helping-hand dev. Some people had a hard time understanding the exorbitant paycheck, when all you do is sit with the developers, not even being a PM? (TBH I've been an ad-interim PM in most of these projects for a few weeks, and it usually helps - lead by example etc).
TL;DR: businesses/teams do get stuck, and a consultant who knows what he's doing and doesn't care for titles can turn around things.
EDIT: The one thing that's lacking in this article, is the social aspect. If you are only fixing code, you are just fixing the symptoms, not the causes.
While I somewhat have a noob understanding of Haskell, and some experience with monads, the parallels between composing functions (i.e. "id" & (.) ) and composing monads i.e. "return" & (<=<) never really occurred to me. Now that I've seen this, I'll probably start looking for similar patterns in other places.
This has been what made Haskell click for me: the minute you start doing something that is slightly repetitive, like a for loop including a continue/break, parallelizing code or using if error/null all the time, there's a pattern there. Haskellers recognize these patterns, and implement them once, so you can reuse them and avoid making mistakes by implementing something similar yourself every single time. Having this opportunity makes your code more shorter and concise, and instead of implementing something yourself, you can use these battle-tested implementations to model your code. (And thus avoid those annoying not-null/if error bugs for example.)
Even though Haskell might not be suitable for every problem domain, I found out it really shines by it's explicitness. You model your domain using types for intermediate states, and the exercise of converting one type to another is rather trivial. (f.e. a sudoku solver [3]).
The biggest problem for me personally has been my inability to speak the category theory language, but I'm learning... I also believe that the basic Haskell libs need examples next to their descriptions, because most of us learn by example. [1] If I can see what a maybe monad is for, I can start using it without properly understanding monads. After a while you'll have seen enough different types of monads to understand their use case. IMO one language implementer that understood this extremely well is José Valim, just take a look at the Elixir docs for data.list. [2]
Because Haskell has been mostly implemented by mathematicians and computer scientists, they assume basic upfront knowledge. This is what makes it hard for beginners. What we really need in the Haskell world is some cognitive bias mitigation. YMMV.
* [1]: https://www.reddit.com/r/haskell/comments/3rhpyq/as_a_haskel... * [2]: http://elixir-lang.org/docs/stable/elixir/List.html#function... * [3]: https://github.com/ToJans/learninghaskell/blob/master/0003%2...
I'd even assume it's 'inspired' by it, as they did similar studies and came to the same conclusion...