Hacker News new | more | comments | ask | show | jobs | submit login
Tech Choices I Regret at Spectrum (mxstbr.com)
309 points by theBashShell 37 days ago | hide | past | web | favorite | 122 comments

It seems contradictory to me that author learned to "deliberately assess cutting edge technologies, bias towards conservative choices," yet he regrets not using react-native-web and Next.js.

I find the regret for not using Next.js to be interesting, because I don't think it would have been a particularly good fit anyway.

I've built an relatively high-traffic SSR'd React website from scratch, and I've done the prototype for the rebuild of the website at work (we're moving away from Gatsby). The reason I'm considering Next is precisely because what i'm building isn't a "web app" like Spectrum, but merely a website (with some e-commerce features).

The sweet spot for Next.js seems to be that you're trying to make something that resembles a traditional pre-React-era website in structure, but just happens to be built using React. Once you're building an app, it doesn't feel like the best tool for the job. You can obviously bend Next to your needs, but fighting the framework is the last thing you want to be doing in the first year of a startup's life.

They managed to get an exit, which is a great result. And obviously they've learned a lot in the process which is another great outcome. But I can't help but feel that having just one experienced engineer on the team would have made their road a lot less bumpy.

Out of curiosity, what was your reason for moving away from Gatsby? I found it very pleasant to work with. I actually moved from Next to Gatsby for personal projects because it felt more intuitive for me, and I like the plugins that they offer.

Not the OP, but Gatsby works well for sites that rarely change content. For e-commerce sites with >100 SKUs + variants, having to rebuild every single time you make a description update is pretty tedious, and Next.js seems to be the solution in that case.

It's only tedious if the build is not automated, static site generators work pretty well with continuous delivery practices though.

Can't you use "dynamic widgets" inside Gatsby with some router tweaks, or did I misinterpret this blog post regarding Gatsby as "app shell"?


You can do whatever dynamic things you want with Gatsby after the page is loaded, including client-only route. The issue is that if you need anything "dynamic" (eg user-specific stuff in the header, or layout variations for A/B tests) in the initial render; you have a more difficult problem.

For A/B tests you could generate all the variations during build and have whatever sits in front of the site be responsible for serving the right files, but this just feels like an admission that, yes, static sites have their limits. For user-specific stuff the only real solutions are to go back to having pages be server-generated, or go all in on technologies like Edge Side Includes.

Lots of small reasons that added up to a feeling that we were constantly fighting Gatsby. A proper answer probably deserves a blog post because I want to make sure what i'm saying is properly reasoned, Gatsby is a great project that doesn't deserved FUD. But I answered the same question on Twitter yesterday, so here's a short summary:


Wait until the author hears about react-native-web-native, the go-to solution for using your react-native-web components in a native environment!

I honestly can't tell from your comment if that really exists or is satire.

Neither can I. I'm I'm leaning towards it existing but being used as a vehicle of satire, because that's just how crazy the world is now.

I don't know why I find it so funny that the browser's back button doesn't work in the examples[0].

[0] https://necolas.github.io/react-native-web/examples/

Because re-implementing native browser features that are core to an application's usability is a hard problem that "cutting edge" web frameworks open you up to?

My hope is that LiveView from Phoenix, ( along with some form of Mobile Apps Default Solution ) would finally fix 90% of what we need without ever touching / resorting to what we are doing on the client side right now.

Finger crossed.

Also that the examples are broken right to frack...

Screenshot: https://boring.host/MWDuAnO

Satire, because react-native-web-native === react-native, so there is no need for such a module

In the same way that react-native-web should be "react"?

It is based on React, it is basically a react implementation of many react-native specific components, such as View.

Sure. In an ideal world programming would be the same irrespective of whether it's Web, iOS, Android, Server Side etc. But because the platforms are quite different you have different libraries and programming models.

Hence why React is not the same as React-Native-Web.

This doesn’t answer the question.

We've only got two more years on this hype cycle, right?

I do not think author contradicts himself at all.

If they would have used react-native-web, he would have saved some time writing the Android (or IOS) apps. Because he could have reused the code (he said that too).

This is what I have done, anyway. Also react-native-web is very very high quality library. I am just amazed at the quality Nicolas Gallagher is putting out.

My app now runs on web and via browser on android/ios with all the magic of responsive UIs, reshaping all those positions when a user rotates the screen or zooms out.

I am wondering, on occasion why I spent time on native apps (even with React Native) -- at all, as React Native Web (with a bit of React-bootstrap) -- are just amazing.

Wrt next.js, at least when I looked at it mid last year, did not support routing with React-router. And for me it was a big deal, I did not want spend time on learning specifics next-js routing.

Instead I went with https://github.com/jaredpalmer/razzle which supports React Router for routing, which I use Android/react-native and React-native-web, uniformly.

React-router, is also very good and useful library with nice, intuitive architecture for routing.

At the end, I decided for my need the Server Side rendering is a later-stage item. So I have not spend more time on it.

I suspect Spectrum did not loose much traffic because their app is not using SSA routes.

Zulip chat app (may be they are spectrum's competitor, not sure) - uses React Native for mobile (https://github.com/zulip/zulip-mobile ), but something else for web. As a reference.

So the reason why Zulip doesn't use React for the web app is that there was no React(at least not available for public) when Zulip started out in 2012. The Javascript frameworks which did exist in 2012 no longer exists or is not used by anyone anymore. Zulip still uses jQuery with some internal abstractions. The reason why Zulip decided to use React Native for mobile app was probably it was much easier to have a single codebase than maintaining a different codebase for Android and iOS. Same reason for using Electron for Desktop app. That said we have been talking about the possibility of using a Javascript framework for Zulip web app for a while now but we have not found a good enough reason to make the switch yet. See the following link for more details https://chat.zulip.org/#narrow/stream/6-frontend/topic/vue.2...

I wouldn't trust any 'open source' project which has received funding from investors (especially early stages) - These projects are almost always hype-driven. They're popular because the team is good as social networking; they mostly leverage their blogger friends to do writeups and spam tweeter until people believe it.

React has become the most popular way to build front ends that are interactive. Many sites still need rendering on the server side for SEO purposes (CSR and SEO do not mix). So when your content needs to be highly indexable but has many interactive elements SSR react seems like a good choice. In this scenario, Next.js is the most "standardized" choice.

If I can ask a somewhat ignorant question... is there no way to render a traditional HTML page from a normal (Django/Rails/PHP-style) server-side template, and then add React on top for interactivity? Is it that everything has to be built in React and it can't work with exising DOM elements? or just that it's easier to do everything in React and not have a separate static template, or something?

Is the answer any different for React Native? (I guess you lack a server-side renderer at that point, so maybe it's easier to plan to do everythig in React if you plan on using React Native?)

You can absolutely add React piecemeal to an existing page. That's actually how Facebook does it. You just call `ReactDOM.render()` multiple times, with different target parent nodes.

I'm doing it at work in an app that's still 80% Backbone. We're replacing Backbone Views piecemeal, with each chunk becoming a separate React component tree [0]. It's certainly easier if it's all one big React app from page load, though.

I haven't used React Native myself, but I _think_ you can use RN in a similar way. I think I remember reading that the Facebook app uses RN for certain pages, but not others.

[0] https://blog.isquaredsoftware.com/2017/07/react-redux-backbo...

This is a way to go in many use cases. This though doesn't work super well if the same content/components in some contexts/pages needs to be rendered on the client side and in other cases needs to be rendered server side.

Yep, and this is actually the method I'd recommend for a variety of reasons. When we were looking for a modern framework for a project a while ago, the ability to do this was actually one of the main reasons we gave react the thumbs up.

React can render static markup without additional frameworks. You can basically run your React code in Node.js and either cache the HTML to disk or have it run on request.


This ignores the "has many interactive elements" part of my comment. Having server-side render react code that can also hydrate and then be interactive (or at least parts of it) is not that simple.

Hydration is also built-into React [0]

I'm curious about what you consider complex about an SSR setup with React, I'm becoming very familiar with the internals of React and frameworks like Next and they're often relatively thin wrappers over the built-in features.

[0]: https://reactjs.org/docs/react-dom.html#hydrate

I think that the most important line in this article is "Changing these decisions would not have made Spectrum a better product by itself."

Assuming that you make somewhat reasonable choices in the first place, technology likely won't become a problem for quite a while. At which point you either have succeeded enough to have the resources to fix the issues that come up, or else you have bigger problems than technology and should focus on those instead.

I really love that you pointed this out. This is why things like getting wrapped around the axle deciding between React or Angular for your next project and "which is better?" type of decision-making frameworks that engineers often get stuck in miss the point. More often than we can appreciate, pick something, anything (!), and move forward.

Making mistakes means the author delivered a lot of features to users that they wouldn’t have otherwise.

RethinkDB sounds terrifying though, I’d hate for my DB errors in production to literally have no idea what to do, it makes me feel sick thinking about :-)

I think we should aim for kludgy but boring working solutions first - for example I’m tempted to write a redux middleware that sends dispatched actions to the server and manually sync, order and manage conflicts in these events to build a “perfect” system where front end state management and backend CQRS perfectly marry up. It’s a terrible idea because I know how to build the Podcast app I’m making perfectly well without any of this nonsense.

For me, the fact that "They allow you to listen to live updates on (almost) any query." would've been a huge yellow (red?) flag. If your database tech does this_amazing_thing_that_nobody_else_does, you'd better be goddamn sure you understand the reason why nobody else does it, AND understand what are the compromises that this brand_new_tech did in order to support that. You probably pay somehow for that amazing feature - what is the cost, really?

WRT "… If your database tech does this_amazing_thing_that_nobody_else_does, you'd better be goddamn sure you understand the reason why nobody else does it …"

I think several databases actually do this.

For example, Alerting in MarkLogic


Another example is

Percolations in Elastic Search



My personal view is that those are useful features, however, often they indicate poor architecture where developers did not create proper APIs that put data into the database, and instead rely on database 'triggers' (or percolations/alerts) to notify the 'world' about changes.

Those kinds of notifications, should really be coming from either data consumer or data producer APIs, -- not from the database engines.

You can do that with PostgreSQL logical decoding, which listens to the replication stream. You can write a plugin in C to emit the updates in whatever form you need.

Right; but you have to implement it yourself, and you'll know the limitations (e.g. it'll probably be expensive to notify on changes to complex queries and/or on many queries).

I actually implemented this (i.e, your parent's idea) for a product. Took me an afternoon to read the documentation and source of the logical output plugin and build a logical replication receiver (using the guts of an existing binary-protocol driver).

Of course, that is a testament to the quality of the documentation and the source code of PostgreSQL.

The fact that the Logical Decoding and Logical Output features were built for replication means that some decisions were taken not-in-favour of publishing changes, obviously, but it works pleasantly and straightforwardly. Even writing a custom logical output plugin would be simple, because Pg does all the transaction tracking, position tracking, change decoding etc.

Why do you need to do that...


Should be okay for 99% of needs no?

That sounds like you'd need to manually enumerate all possible queries you'd want to listen to and have all writers do the work of deciding which channels to update.

The idea of simply being able to listen to a query without any additional work sounds like it could be really attractive in certain situations.

"The idea of simply being able to listen to a query without any additional work sounds like it could be really attractive in certain situations."

Sounds a lot like RethinkDB changefeeds https://rethinkdb.com/docs/changefeeds/ maybe check that out first :^)

> I think we should aim for kludgy but boring working solutions first

Nice idea in theory. Can be awful in practice.

For example in enterprises it's very common to see applications last years or even decades. And so that kludgy but boring solution would be the foundation on which you will have hundreds of engineers and years of work built on top of. And because your kludgy but boring solution worked in the beginning you rarely go back and redo it.

Hence why you see a lot of upfront developers built these over-architected monstrosities. It's because they are trying to cater for a decade of possible new features.

This doesn't sound as bad a situation as you make it out to be...

Dev Person: "Hey boss I finished that X, but I used a framework that hasn't been cool for at least 5 years but it will probably last a decade without a rewrite and everyone can build on top of it."

CEO Person: "That sounds great, please keep doing more of that!"

Admittedly, I like playing with the new shinies as much as the next dev, the above scenario sounds horrible to me to :)

You either die a startup or live long enough for everyone to hate the madman who picked the stack.

In my case, you either die a startup or end up having to rewrite the whole thing in React... all 30 years of technical debt.

This is always the best because you get to reimplement misfeatures in your shiny new codebase because “we don’t want to change how customers are used to working”

Bug for bug rewrites are best because “You never know what system out there is relying on current behavior”

I think boring could also be described as easily understandable. Kludgy could be interpreted to mean that all possible theoretical scenarios are not handled. Working could mean that the product works for the use cases it was intended for. In that case, I see this as a very positive pragmatic approach.

You don’t waste time implementing features you “know” you will need in the future (you don’t know). You don’t waste time handling scenarios that make your feature theoretically complete and elegant but that have no significance to the users of the product. You go quicker to market and can more quickly iterate on your product.

I think a much better approach is to implement these kludgy solutions that apply to the specific problem being solved. Then, you can revisit the code when it makes sense (e.g. the scope of the feature is being expanded, or just do it regularly to keep things healthy). Generally holding off on implementing things you don’t need will put you in a better position to implement the things you will need when you reach that point in the future.

Think about the use-case where you want all your Relational data to be denormalised and written to a S3 bucket and then loaded into something like Redshift for analytical loads.

If you start pushing the data from your application itself then you introduce the problem of dual-writes (what if S3 write failed? what if RDBMS failed?).

If instead you treat your RDBMS as the source of truth and use something like PostgresSQL's logical decoding feature to listen to the replication stream and then push the events from that stream to S3 you can achieve guaranteed-eventual-consistency.

The best way would've obviously been to make your application write to a Message Bus (Kafka etc.) and then some other application would persist that message to your RDBMS. This approach requires more development effort and introduces all the issues that distributed systems face: Read your writes, read follow writes, write follow reads etc.

Yes, I’ve worked on systems that use Kafka to do exactly this...

I'd love to discuss more on this topic with you since I am currently working on implementing a proof of concept for the same. Since I've just had almost 1 year of software development experience (2017 grad here) the task feels too daunting to me. Also it's just a one-man team since its a proof of concept.

Oh man, rereading the comments above made me realise i replied to the wrong comment. Doesn't matter though.

> front end state management and backend CQRS perfectly marry up.

I am currently researching how to do this properly. What would you think would be the "boring but reliable" way to do it?

Well I want to do this but the point is I think it's research and unknown; I'm actually saying don't do this! Have an endpoint and call it for changes. No stream of events perfectly queued and ordered between systems. Just accept your app won't be as clever and well designed but it might actually just work :-)

I clicked on this hoping this was the "Spectrum" cable ISP. We don't hear too often from ISPs and infrastructure companies on HN.

It would be quite cathartic to read an apology for the shitty software on cable boxes.

Thought that it was about ZX Spectrum by Sinclair.

And here I thought it was about a technologist working at the vitamin company, Spectrum.

Me too, shows how old I am :-(

There’s also an AWS offering called Spectrum and a data enrichment platform called Spectrum. Pretty overloaded name.

There's also an engineering trade magazine called Spectrum. It's everywhere.

IEEE Spectrum has been around for a long time and is one of the reasons I became an engineer. I can still remember tearing into the article on the DARPA Autonomous Robot challenge.

You could monitor your AWS Spectrum and data enrichment Spectrum with Spectrum by CA Technologies.

For a reason.

I am right now on the train home from work quite late (22:40 local time). The reason I spent so long at work today is because we update after 8 o'clock. However, we found a critical bug in some open software that we use that we do not know why it triggers. We barely even know how it happens! Of course we haven't been able to solve it yet... After personally spending a lot of time with trying to fix the software I can say that I have gotten a much deeper appreciation of tools that are widely used and with an active community, where most bugs have already been solved.

Previously I had believed if you had a tool that solved the exact problems you have, then you should use it. I hope I'll resist such an urge in the future by having a little pragmatic angel on my shoulder reminding me of the danger of underused software. No software is perfect and even tough you might be able to fix software when it is open source, you paint yourself into a corner when you will necessarily have to fix it.

I felt my experience was matching some of the authors woes and I urge anyone that chooses technologies to think one step ahead and learn from our mistakes!

To avoid burning out I suggest:

1. Deploy

2. Test deployment

3. If success, great go home at 8:10pm.

4. If fail, rollback, retest, go home at 8:20pm. Come in next day and fix in source code and schedule new deployment.

5. To avoid #4 in 99% of scenarios, use a staging environment.

In my experience staging environments only work in a few (very common) use cases. When I do big data work I certainly use a test environment but we can't just replicate all the data in two clusters because that would be absurdly expensive - and this makes testing performance basically only possible in prod. I'm sure basically any database system with a non-trivial amount of data has the exact same issue. But staging definitely works for something like a web server

Luckily we have "update nights" at most once every other month. But the workflow you describe is what I would want in the end. I work in a small startup tough so change is happening rapidly to make these processes better. It's far from institutionalized!

We do however have a staging environment already that is frequently updated and updates available within an hour from starting the update.

Thanks for the concern and tips nonetheless!

> We are building native apps now, but starting from scratch is time consuming. If we had used react-native-web to build the website, we could have reused the base components and built the native apps much faster!

> Optimize for iteration speed and flexibility.

Faster, but not necessarily better. Reusing web technologies for mobile is almost always an optimization for developer time, which might work early but I feel almost always ends up needing to be rethought in the future.

I think it's reasonable.

React-Native uses native widgets and doesn't bring too much Web tech.

You can still replace screens with native modules later if they don't perform well.

If you start, you need to get something usable out of the door quickly before you run out of money.

The phrase "optimize for iteration" feels like something you do when you don't know what you're doing. They say experienced developers spend most of their time thinking, vs. writing code, and so with inexperience you don't have the tools to eliminate iterations in your head.

In a startup, by definition you don't know what you're doing. Once you know what you're doing, it's not a startup, it's an established business. Once everybody knows what you're doing, it's called an industry. It's usually fruitless for a startup to chase after problems that everybody knows how to solve, because somebody has already solved them, probably better than a small team of junior developers can.

Experienced developers spend most of their time thinking because experienced developers tend to work in fields where at least the problems are known, as well as some best practices for solutions. That's how they got to be experienced, after all. But this is also why experienced developers, when they choose to found startups, often end up with B2B startups that slot into an existing industry structure, not startups that end up defining the industry.

(Source: experienced developer now founding a startup and wrestling with just how little all that experience matters when it's not even clear what problems will dominate the industry or if the industry will even come to exist.)

The tools for making a mobile application is something that I consider to be "solved", except in some very specific cases. If you are a startup, you are likely innovating in something that is not making apps, so I do not agree that you "don't know what you're doing" in this area.

The article states that the product was initially solely web-based, and for a good reason: they expected the majority of their traffic to come from content-based SEO. That's the kind of product insight that can and should drive technology choices and might drive it away from "solved" mobile development practices.

(Having used react-native-web for a project once, I also question whether it actually would've improved things: the HTML generated by react-native-web is terrible for SEO, and they might never have gotten to the point where they had users asking for a mobile app if they'd gone this route. Hindsight is 20/20 and often forgets about obstacles on the path.)

"Experienced" and "effective" aren't necessarily correlated. I have worked with a handful of experienced developers who have been writing C and shell scripts since the '80s and have gotten really good at writing C and shell scripts like it's still the '80s. If you ask them to build something you can operate with an SRE team instead of with a sysadmin one (and not even in those words), they get very confused. So you give them problems where you can use their very specific experience very well.

Both inexperienced and experienced developers can work effectively in problem domains where there is no clear path to a solution, and where even the problem itself is underspecified and changing. It takes some practice to figure out how to work effectively in such an environment, but at some point you run out of opportunities to have gained deep practice because the problem is too new.

On the side I'm building a communication app myself and I've started over a few times now. I made some mistakes in early development that caused starting over to be the best choice (I'm not a perennial start-over guy, things weren't very far along when I restarted, this is just a side thing).

Mistakes: I did plenty of backend work (e.g. gRPC services) just to realize it didn't mesh well with the frontend when I started to build it. I over-complicated the feature set and realized I built a foundation for an MVP that would take forever. I abstracted everything because in my head I thought about all the future uses. I worked on an advanced-tech frontend that kept me bogged down in frontend development instead of doing the whole thing. All of these are typical mistakes of pie-in-the-sky side projects sans deadlines.

For the latest iteration I have changed my approach. I am building the dumbest web UI w/ the dumbest in-memory-only-at-first backend with minimal abstractions. The initial web UI doesn't even use any JS which I know can seem like extra work w/ HTML forms and the like, but the raw simplicity is easier to build now and take away later than something more complex. I'm deferring lots of features. Once I reach a web-UI-only MVP, my next step will be to abstract what already isn't on the UI front and make a Qt app that uses the same abstraction. I've found this to be the easiest way to get some UI idea reuse across different paradigms. I can add more UIs including an API, terminal, mobile, etc with this approach. For the backend, simple gRPC backed by a "db" of in-memory data structures for now until I abstract that to allow sqlite to join and then on from there. It is very refreshing to develop a full-stack app without a complex full stack. The major benefit of developing a stupid-web-with-in-memory-db MVP? Testing and quick iteration. I've found you can iterate on core structures/ideas or you can iterate on external tech/features, but you can't do both at the same time.

I feel like they missed a couple of critical takeaways: First, build on technologies you already understand, if possible. Don't build from scratch on something you know nothing about. And second, make sure you have some backend expertise on your team. He says up-front the three person team was heavy on design and front-end expertise. So it's not surprising at all to me that they had big problems managing and troubleshooting their poorly chosen backend tech.

A great mobile experience on desktop is bearable and only needs tweaking to work well.

That depends on your product and your audience! Many (probably most) B2B apps work poorly in the constraints of mobile. If your users spend their 9-5 hours buried in your app at the office, they probably value things like hotkeys, multicolumn layouts, and high-information-density pages.

Great point and I can confirm this. Working on enterprise apps in the past and seeing design teams choosing something like Material Design for those web apps, even though it's not suitable for those apps, especially because the information density is poor when using MD.

That is a great point, thanks for making it. You are absolutely right, I was overgeneralising with that lesson!

RethinkDB, an ironic name in this context.

At least you can't say they didn't warn you!

Regrets: not using cool new frontend things while using cool new backend thing.

It's just a question of risk assessment.

Will the new tech give you leverage over companies who don't use it or will it be discontinued and leave you with unmaintained crap?

Will the old tech give you a stable base to build upon or will people with new tech overtake you with less effort?


Not using something seems like a hard case to make. The author doesn't know what would have happened had he used another tool. However, I do believe it's possible to properly evaluate a tool after having used it, so... 2/4?

I admit I'm hoping (although not remotely expecting) that now that Spectrum is part of the GitHub/Microsoft nexus, they'll contribute some development time to getting RethinkDB going again, even if it requires another fork -- there was a brief "RebirthDB" fork that was, theoretically, going to become the official release, but that seems to have stalled, too. The 2.4 release has been "nearly ready" for over two years now, and I'm kind of afraid that the lost momentum will be unrecoverable very soon, assuming we're not already past that point.

RethinkDB was so promising and still is in a way. It just didn't take off as an open source, openly government project (yet). It's still early though. I hope it forms a great community around itself and becomes a major open-source database offering. Apache or CNCF adopting it wouldn't be the worse thing ever even though not a super CNCF like product.

I worked at a startup that used RethinkDB too.

Change feeds sounded cool, but we never used them in the end, because of the latency.

I didn't use react-native-web, because back in the days it was alpha and later there was react-native-dom, which seemed like a better approach, but I have the feeling it doesn't have much pace to get anywhere any time soon :(

This is tangential/possibly off-topic. I was wondering if anyone could educate me as to why this site needs to use next.js in the first place (the site of the blog, not spectrum). It's mentioned in this blog post and I followed the link. The full tech stack is given here -> https://github.com/mxstbr/mxstbr.com#tech-stack

I went through the codebase, and the content itself is static. I'm not attempting to bash the decision to use next at all. I'm only looking to grow my understanding of the usage of next since I see it being mentioned a lot.

The question I have is, why use next/react for what appears to be a static site. Or, why not use static html + markdown?

Again, not bashing. Just looking for reasons that I might have missed due to my lack of understanding/context.

Same reason why some folks like Gatsby. Navigate around his site and you'll see it loads in very quickly and with push state instead of full reloads. It's been done many times over for every stack and client side tool (pJax!) but that includes the next.js router.

It's fast, but for a simple site like this I suspect plain HTML + cacheable CSS would be just as fast.

who among us who uses react is a css master tho?

yeah you can do that with html and javascript since the 90s

Having built my blog with React Static, I can tell you that this is far easier and fool-proof to do than it is using HTML and Javascript. It might sound like introducing a tool is overcomplicating things, but in this case, it really is simpler.

(Not sure if this holds for Next.js as well, since I believe it does a few other things too, but React Static has been a breeze for me.)

Some of these seem difficult to predict. If you knew in advance that Github would acquire, WYSIWYG over markdown wouldn't have been a priority. You couldn't have known that, however. Developers know markdown, web creatives know markdown, but does anyone else?

You are inverting the reasoning. GitHub bought us because our main audience is developers. We should have stuck with markdown, because our main audience is developers, not because GitHub also saw that and acquired the company.

> Developers know markdown, web creatives know markdown, but does anyone else?

Randoms who comment on Reddit. It’s not a high bar.

I actually prefer using markdown than fighting with an opinionated WYSIWYG editor. (Looking at you Word).

Summary: "computers are hard, getting the software written correctly even harder". Yeah, that's right! If you're struggling with this, it time to seriously consider another profession.

Barrier to entry being low is really misleading. It never was low and because of how generic and complex computer systems are, it isn't low now. It will only get more complex as time goes on, unless everybody pulls together and fights tooth and nail to go back to writing small, fast software. Anybody considering "I just want to program and not worry about low level details! Which framework can I use?" should stop dead in their tracks and seriously consider what they are doing with their life.

I ran into similar issues with Draft.js, but Trix has been amazing:


It's not that hard to wrap it as a React component and get going with it

I would have gone with markdown and/or some other markup language. It’s so much easier to leaverage other tooling (e.g Git), when your source text is a widely used text format.

Definitely. Our users aren't as tech-savvy, so we wanted to have some basic WYSIWYG functionality instead of educating them on markdown.

Kind of impressive that they built Spectrum with just three people. Nice write up.

I created a public community for Hacker News itself: https://spectrum.chat/hackernews

Something that I have always disliked about HN is the lack of the ability to delete comments and accounts. OTOH, Slack etc are private and lock up good content/discourse away from search engines. Hopefully, spectrum will offer a better balance.

The name "Spectrum" has regrettably been ruined by Charter, which has the same poor and indifferent customer service for last mile cable internet customers as other competing giants like Comcast.

Was using node over another language/ecosystem a baked-in requirement?

A chat application is to node.js what a blog was to Ruby on Rails or PHP -- it's basically the default example of every framework and library. Low complexity, high throughput. So you'd have no trouble finding good examples and libraries.

For a while, Erlang was quite popular in that area, but as some orgs only used it for that and thus didn't get too deep in the tech stack, they were eager to switch to something they imagine they know a bit better.

Erlang had the problem that it got more popular at the same time as the rise of Go happened, which also played the back-end-concurrency game.

The only programming language we all know is JavaScript, so it was not an option to go with another backend language.

I would love to learn Elixir though, from what I have heard it is great for real-time!

Seems like some pretty domain-specific(frontend)choices about which $jsThing to use, and one pretty bad operational miss on choosing a DB tech correctly.

Interesting read, as always the business value is the one that should be assessed for technology adoption, not coolness factor.

What would you replace Draft.js with? Slate?

We went with ProseMirror for https://wikiful.com. It's probably the most powerful but is also not a plug-and-play setup and required a handful of tweaks.

If I wanted a lighter solution, I'd probably give https://trix-editor.org/ (made by basecamp) a try.

Rethinkdb was complete trash. A bane to run and pathetic at scaling.

Small backups took hours. It was extremely difficult to tune.

A bane to run? Like what happened when you ran it?

Constant slowness and down times. Bad logging that did not provide enough information. Database backups would take an ETERNITY to dump, and even longer to restore.

We once had a 5 machine cluster. We decided we needed to re-balance the cluster. The thing COMPLETELY CRASHED and went up in flames, caused us to have to stay up all night fixing it.

It was the same day we decided to rewrite our application to not use rethinkdb. Best decision we could have made.

The examples are quite interesting but the insights / conclusions are far too simplistic and overreaching

Seems like bad choices and lack of research.

Way too many developers are shocked to learn that Postgres has an existing Pub/Sub system using LISTEN and NOTIFY. Kind of makes some people rethink their stack.

Applications are open for YC Summer 2019

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