HNHacker News
TopNewBestAskShowJobs

mikermcneil

123 karma · joined March 7, 2013

I'm Mike McNeil, and I code and make business and stuff. I'm building tools to simplify cybersecurity, device management, and software development.

I'm CEO of Fleet, open-source platform for security and IT teams with lots of endpoints (https://fleetdm.com/handbook/company). I'm also the creator and BDFL of Sails, open-source MVC framework for Node.js (https://sailsjs.com/about).

LinkedIn: https://linkedin.com/in/mikermcneil Twitter: https:/x.com/mikermcneil GitHub: https://github.com/mikermcneil

submissionscomments
mikermcneil··on Crystal 0.25.1 released
Why’s that?
mikermcneil··on How not to structure database-backed web apps: performance bugs in the wild
Sorry you feel that way! The rest of the team and I work hard on it as often as we can. But deep populate is not a feature we’ll be adding— Sails and Waterline are opinionated, and I don’t feel that the performance penalty and potential issues are worth it— instead, we recommend using a native SQL query when you need to do a custom join.

Built in support for WHERE subqueries, on the other hand, is on our roadmap. Currently working to finish core MSSQL support first though. Hope that helps!

mikermcneil··on SailsJS 1.0 – Rails-like JS Framework
Of course— luckily there are many great, framework-agnostic options for use in post-production. I usually use knex.
mikermcneil··on SailsJS 1.0 – Rails-like JS Framework
Creator of Sails here. I’d like to set the record straight: The automigrations system is not, and was never, designed for production use. Sails/Waterline documentation explicitly and repeatedly warns against using this feature in production.

On top of that, developers are forced to accept a prompt on the terminal the first time they lift an empty new app indicating that they understand this. The only way to make the prompt go away permanently is to hard-code configuration, indicating that you understand what automigrations are designed to do.

In fact, just to be safe and prevent accidents, automigrations are forcefully disabled in production mode.

In other words, to get your production/staging app into a state where this criticism is relevant, you have to ignore console warnings, skip reading the documentation, and go out of your way to trick the framework into thinking you’re running your app in development mode.

I won’t beat a dead horse re other points in that 3-year-old blog post, except to say that, 3 years ago, some of them had merit. Those have been addressed in the Sails 1.0 release.

mikermcneil··on SailsJS 1.0 – Rails-like JS Framework
major changes occurred here in 2017 with `await` making its way into the LTS release of Node - more on that: https://gist.github.com/mikermcneil/c1028d000cc0cc8bce995a2a...
mikermcneil··on Show HN: Server.js – A modern Express alternative
As long as you're on Node >=v7.9, you can also use `await` in Sails, Koa, or any other tool that supports promises. There's some work we had to do to make it feel nicer, and we had to update docs and stuff, but for the most part it was pretty painless-- all thanks to the JavaScript engine.

And `await` is so much easier and safer than callbacks in userland code! Really excited about Node.js in 2018, now that `await` is supported in the LTS release. Callback hell is finally dead.

(Diff showing a refactor of an example app from traditional callbacks to async/await: https://github.com/mikermcneil/chatkin/pull/4/files)

mikermcneil··on Show HN: Server.js – A modern Express alternative
A lot has changed in v1
mikermcneil··on Ask HN: What's the Best React UI/Nodejs Framework for Angular/Sails Background
I'm a fan of both Vue and React native. Check out https://github.com/mikermcneil/chatkin for an example app using both
mikermcneil··on Constraints on the Universe as a Numerical Simulation (2012)
If I'm running Linux in a VM, I don't think of it as a simplification-- but it is way easier to just shut it off and reinstall if something goes wrong.
mikermcneil··on Treeline – Develop Node.js apps in your browser
The rest of the team and I are hard at work on the next release, which applies a lot of the lessons we've learned from the beta so far (esp. adding support for loops, control flow convergence, and hotkeys.) We're hoping to get that out the door shortly after we launch Sails v1.0 later this year.
mikermcneil··on Show HN: Live Dangerously – 1-for-1 anonymous photo sharing via SMS
So far, batting way better than chat roulette :p
mikermcneil··on Show HN: Live Dangerously – 1-for-1 anonymous photo sharing via SMS
Well I mean I guess because you never know what you're going to get
mikermcneil··on The State of Meteor Part 1: What Went Wrong
Understandable-- but if you are productive on Meteor today, or you and your team have already committed to learning about it, I would suggest that you should see that through. This kind of uncertainty/doubt around open source frameworks is par for the course, unfortunately, and I think it would be a real shame to stop before you've at least built a prototype with the technology you've already invested time with (particularly since so much of a v1 is figuring out the interface/interaction design anyways, y'know?) Just my 2¢.
mikermcneil··on Ask HN: Which people and groups are researching new approaches to programming?
@rl3 Thanks for the mention :)

@maryrosecook I'm glad this post showed up in our Slack feed- really cool topic! As I'm sure you've noticed from the volume, variety, and impressive comments in this thread, improving approachability/usability for software development is an exciting (albeit broad) effort, and there is a lot of amazing work underway. In the area of declarative programming specifically, there's a lot still to do, but as a community we're getting really close. That said, there is far too much work to do here for any one team to do it by themselves.

To be successful, or at least to expedite the process of democratizing software development, I believe we need to establish a common set of semantics for describing _what software is_. And the first step towards that is deconstructing functions-- or perhaps more accurately: "subroutines".

The rest of the Sails.js core team and I have been working on this problem for quite some time now, primarily as a reaction to having to build plugin system after plugin system in Sails as the framework's user base grew, and getting frustrated with every plugin system being a little bit different. After we had our first working prototype of the tech that would become Treeline, we extrapolated and open-sourced the machine specification and related utilities as a way of exposing building blocks for other devs to reuse for their own projects.

To add a little background, machines are stateless building blocks; nothing fancy. They're more or less equivalent to asynchronous functions in JavaScript, just highly specified. In particular, machines encapsulate definitions of their inputs, their exits, and whether they are "cacheable", just "idempotent", or neither (and therefore have side effects). Machines are oftentimes implemented as JavaScript functions-- although part of the project's philosophy is that what's important is the _usage_, not the implementation.

From the perspective of a traditional "intro to programming", an example of a machine is `moveTurtleDown()`: https://gist.github.com/mikermcneil/864b930a67b0d00d3d8b

As a more practical example, here's the documentation for a handful of machines related to string manipulation: http://node-machine.org/machinepack-strings (To try any of them out, just copy and paste the generated sample code into e.g. a Tonic sandbox: https://tonicdev.com/npm/machinepack-strings)

Each of a machine's expected inputs may be required or optional (with a potential default value) and declare a type schema. Each of its exits may optionally declare a return value, and if so declare a type schema for it. In addition, machines have strict conventions for meta properties (e.g. the machine `description`, which summarizes the machine's behavior when run, is ~80 characters or less of English, written in the imperative mood and in sentence case with ending punctuation)

This can be used to generate documentation, code for interactive form elements, or in the case of the default machine runner, runtime type validations.

But most important of all, once a piece of code is written to the machine spec and open-sourced, it can be used by any tool or platform which consumes that spec (think USB).

As an example, in Treeline we use machines as draggable/droppable components that you can compose into what we call a "circuit"; which can _itself_ be used as the implementation of another "composite" machine with its own inputs and exits (vs. an "analog" machine; i.e. a machine implemented with JavaScript code). We are planning to publish the circuit spec and related tooling for composite machines later this year. In the mean time, the analog machine spec is stable and ready to use. Around 500 MIT-licensed machines are available today on NPM, with generated documentation hosted on the Node Machine registry.

Hopefully that was a helpful first look- if I can help explain further or if you'd like to discuss the project roadmap, just hit me up on Twitter. It's really awesome to see so much new interest and progress in this tech, and particularly in the context of education. Excited to see where you go with CodeLauren!

mikermcneil··on Is Express.js dying?
Perhaps, but I can assure you that Express 3 and Express 4 are completely safe. The interface set up by Express is depended on by far too many companies and other frameworks for that to not be the case -- for instance, even though Express 3 is officially unmaintained by Strongloop, the Sails core team has committed to taking over critical patches.

As for the future of Express: I've only had the opportunity to get together with Doug in person once, but we've talked about this a few times in the past. I can guarantee you the last thing he wants is drama, so I'll leave the ball completely in his court there.

I will say this though: keep an eye on Doug's federated projects (jshttp and Pillar). Whether or not the various pieces are released as Express 5 or not, the _code base_ is still improving and becoming increasingly standardized, regardless of the monicker. More on that: https://github.com/balderdashy/sails/pull/3235#issuecomment-...

mikermcneil··on Trails – Modern MVC Web Framework for Node.js
Thanks for following up, Clay. Sorry sailsjs.org caused trouble for you last year. You're right-- fixing SEO permalinks in our docs (i.e. converting sailsjs.org from an SPA to a site w/ server-rendered views) was a pretty slow and involved process. This was due in part to the fact that we switched to deeply-nested navigation in the docs, but also because of the sheer number of old links we had to maintain from two different past versions of the website. We weren't able to preserve them all, but we did our best to maintain the functionality of as many legacy hashbang (`#!`) and Angular-style (`/#/`) links as we could. I'm glad to hear the doc links are working for you now.

We also owe Kevin Burke from Shyp a big thank you for drawing our attention to the SEO problem in the first place. Regardless of where Shyp goes with their tech stack long term, it has been immensely helpful to learn from Kevin's experiences using the framework there. Those lessons have already impacted the direction of Sails, and will continue to influence its future development.

On the subject of documentation, I wanted to share two other resources from 2015, in case either of them might be helpful for you: The first is a free Sails course on Platzi (https://courses.platzi.com/courses/develop-apps-sails-js/). It covers best practices for authentication, blueprints vs. custom actions, and multi-instance deployment to Heroku, and contains some great Q&A. The second is "Sails.js in Action" (https://www.manning.com/books/sails-js-in-action), a Manning book about Sails written by Irl Nathan (creator of Sailscasts) and myself. It is set to be published this Spring.

Finally re: the next generation of Sailscasts-- I don't want to speak for Irl there, but I should point out that there are 6 episodes of the second series of tutorials available (https://github.com/irlnathan/activityoverlord20). You can also see the final example app that Irl and I worked on together which includes a reference implementation of present/idle/away/offline status, user login, and chat here: https://github.com/balderdashy/activity-overlord-2-preview

mikermcneil··on Status of Sails.js
I've posted some additional comments in the GitHub issue to clear up confusion. Hope it helps provide some background on what's going on.
mikermcneil··on Status of Sails.js
https://github.com/mikermcneil/waterline2/blob/master/Introd...

^^ after spending several man years of effort on the subject, that's the inevitable boundary in ORM development, IMHO. It was this that made me realize that we needed to be focused on providing a better, cleaner way to allow running custom queries using a declarative, database-agnostic syntax, rather than focusing on implementing even-deeper support for xD/A queries.

Also I don't mean to nitpick, but I'm hearing a lot of negativity towards Waterline from a couple of the commenters in this thread, and I'm not clear on how it lines up with specific, actionable criticism that I or the rest of the core team can do anything about. I get that having to use a framework or stack for work when you aren't excited about it is horrible (it was originally how I felt about Grails and Hibernate when I was using them every day in 2011).

But I think it's important to keep in mind that this is always "compared to what". The Java ecosystem has had years to develop tools for working with data, and it certainly still provides more mature utilities out of the box than you're going to get as someone new to the Node world, even today. But I firmly believe in the power and flexibility of JavaScript-- not because it's a good language or anything-- but because we all had to learn it to do front-end development in the browser. And so will the next generation of developers.

Whether we like it or not, Node.js is here to stay. And for me, that's a tremendously exciting thought. A future with the world sharing a common programming language is a goal worth fighting for. It's a future that dramatically lowers the barrier to entry to full stack web development, and vastly expands the pool of people willing and able to contribute to free and open-source technology.

Hang in there :)

mikermcneil··on Status of Sails.js
I'm sorry that this debacle has negatively impacted your opinion of the framework. Other open-source maintainers had warned me in the past that this kind of thing is par for the course as any project grows, but it doesn't make it any easier to deal with when it happens to you. In the mean time, it has certainly made my family's holidays unpleasant, and disrupted the lives of the rest of our team.

I posted a few important clarifications here in the original issue: https://github.com/balderdashy/sails/issues/3429#issuecommen...

mikermcneil··on Trails – Modern MVC Web Framework for Node.js
Sorry to hear you had a bad experience. The auto-migration support in Sails is a development-only feature, but for production, there is a great project from Danni Friedland called sails-migrations: https://github.com/BlueHotDog/sails-migrations

You might also want to check out sails-db-migrate: https://github.com/building5/sails-db-migrate

At Treeline, we're using sails-migrations in production.

mikermcneil··on Trails – Modern MVC Web Framework for Node.js
We are working on Treeline, a tool that compiles Sails.js apps. Our backend is running on Sails.js in production.

Fortunately, Travis did not change the Crunchbase page for Treeline. However, he did deface the Crunchbase pages for Sails, Waterline, Balderdash, and me personally (I've since reverted them).

mikermcneil··on Trails – Modern MVC Web Framework for Node.js
Travis did not play a meaningful role in the development of Sails. He was a contributor for less than a year and made a total of 37 commits: https://github.com/balderdashy/sails/commits?author=tjwebb

That said, I wish Trails the best-- I just think it's important to point out information that is being misrepresented.

If you have any technical issues with Sails, I would appreciate hearing about those on GitHub.

mikermcneil··on Trails – Modern MVC Web Framework for Node.js
Certainly you're not alleging that I created that account to write that comment? Not only do I not have time for that kind of dishonesty, Sails was created while I was running one of those "kind of consulting shops".

Please leave me and my team alone.

mikermcneil··on Trails – Modern MVC Web Framework for Node.js
Sorry for the confusion. This isn't a project from us. Travis Webb (@tjwebb) was added as a contributor in mid-2015, but unfortunately it did not work out. The only contributor who was removed from Sails was Travis, in late November. And ever since, he has been doing everything he can to discredit our project, including claiming that the Sails team is working on Trails, or that Sails is "abandoned". Travis is the _only_ former Sails contributor (i.e. someone with actual write access to our repos) working on Trails.

If you have a technical problem with Sails, bring that up with me or another member of our core team on GitHub. But please realize that this fork is not about technical issues; it is a personal vendetta against me and the Sails.js project.

mikermcneil··on How we took our tests from 100 seconds to 100ms
Also, in case it's helpful, figured I'd mention that we just finished rearchitecting sailsjs.org and the doc compilation process to improve the permanence of links and make the experience of searching for stuff from the docs on Google better (latest updates here: https://github.com/balderdashy/www.sailsjs.org/commits/maste...) Kevin, I know that was something you (rightfully) have a lot of energy about.
mikermcneil··on How we took our tests from 100 seconds to 100ms
Never fear, our new project compiles Sails.js apps-- the core of what we're trying to solve is exactly that (the transition between using a more heavy-handed framework, and being able to customize/optimize/understand minutia as needed). More on the tech here: https://www.youtube.com/watch?v=nZKG7hLhbRs
mikermcneil··on Ask HN: Any good beginner tutorials for Sails.js?
Definitely check out https://github.com/balderdashy/activity-overlord-2-preview
mikermcneil··on Super easy Sails.js full auth template with Facebook&Twitter support
Well done! I see requests for this sort of seed project constantly in IRC and GitHub issues.
mikermcneil··on Ember and Sails.js: Getting Started
awesome
mikermcneil··on DemocracyOS
that's true-- for these guys it actually makes sense though based on what they're doing IMO
← PreviousPage 2 of 4Next →