Ghost 3.0 - <AUTHOR> https://ghost.org/blog/3-0/ <comment><USER2> Hi HN, John from Ghost here. Thanks for the comments about 3.0 — we spent a lot of late nights on this, and it's a pretty big upgrade for Ghost as a platform (which is now 6 years old).

I know the audience here is generally more interested in technical details and reasons for why this took longer than 1 weekend to build. So I'll share a few more relevant details absent from the marketing copy:

\- The new membership system is effectively just an email database with JWT based authentication. Two cool things about this: You can import any CSV of emails and that's now a user database of people who can log in, and 2: not storing passwords at all is pretty great.

\- New billing features are a deep integration w/ Stripe Billing API, which works with your API keys, not via Stripe Connect, so there's no middleman. Ghost can't add any fees on transactions, and volume doesn't flow through our Stripe account in any way - so it remains completely decentralised without a bottleneck. The significant part of that is: If Ghost the company were to ever go away, your site/billing/everything would keep working as normal. Doesn't depend on us.

\- All our APIs and Webhooks have been continually improved to the point where Ghost is now the most popular (at least by Github stars, the fruit of life) open source headless CMS out there. Also a new Github Action for CI/CD of Ghost themes makes that whole process a lot less painful

"What's the point of this, why not just use [x]" Because [x] is some combination of: closed source, centralised, written in decade old procedural PHP, or has some sort of UI which no non-developer wants to go anywhere near. We try to sit at the juncture of these things with a decentralised product, easy to run with a managed service, built with tech developers don't hate, and a UI that people who create content really love.

Also: Something about Postgres

On a serious note, thanks for all the support. Ghost launched on HN and it was that initial boost that got everything started. I'll be hanging out in the comments here throughout the day.

<comment> mkr-hn Do you have any plans to offer a solo professional type plan? ~$350/year and up is quite a lot more than I can justify for what I would use this for. Something like Automattic's Premium plan ($8/month) for a managed blog with a subscription system like this would be an easy sell for me.

I understand if that's a hard no. You seem to be aiming at people who are or plan to be big time enough to hire people to help. Getting people in who might head that way so they have an easy upgrade path might be good though. If I were the kind of person Patreon's top plan aims at, any Ghost plan would be an easy sell, but even thinking about that is a long way off for me.

<comment><USER3> Self host it if you can. I do at [https://sdan.xyz/blog](https://sdan.xyz/blog) and [https://sdan.xyz/essays](https://sdan.xyz/essays) and it works flawlessly regardless of visitors/staff members/etc.

Obviously by paying Ghost to host it for you is a bit pricey since they have to make a profit as well, but the amazing thing is that the whole thing is open sourced for people like us to self host (I wrote a post about how I self host a bunch of stuff including ghost: [http://sdan.xyz/sd2](http://sdan.xyz/sd2))

<comment> mkr-hn I'd rather pay them to do it. The last time I self-hosted, it was WordPress, and the temptation to tinker was too great and distracted from the actual goal of having a blog.

<comment><USER4> Then why not Svbtle or Write.as? You have lots of affordable or even free choices.

<comment> mkr-hn The subscription system, as I mentioned upthread. Making a blog is easy. Making a blog with pay gated access to posts and downloads is not. The closest equivalent is Patreon + WordPress with the Patreon plugin. I already mentioned the issue with self-hosted WordPress. Managed solutions cost more than Ghost and provide less.

<comment><USER5> Sounds like a good business opportunity if someone's looking for it.

call it gHosting

<comment><USER3> Sounds like an interesting idea... selling software under the MIT license which the software holder is maintaining...

Looks like I have a weekend project now!

<comment><USER6> This complaint has never made sense to me; you're selling software/hardware management, not the software itself.

And this is precisely the pain point of the gp... This isn't just reasonable, it's utterly sensible.

<comment> mkr-hn Yep. I don't mind Ghost or Automattic charging so much for managed hosting. That _also_ pays for development. I don't want to assume other managed hosts charging more for WordPress without doing anything more is just greed, but it has the look.

That's why I want Ghost to offer a lower tier. That way I could get started at a price I can afford where I'm at, support the development of Ghost, and have an easy upgrade path if I need it. It's the curve, not the price, that I don't like.

</comment></comment></comment></comment></comment></comment></comment></comment></comment></comment><comment><USER7> I remember when Ghost was released years ago, and I remember thinking "wow, these people have actually gone and released a solid blogging platform to replace the shitshow that is WordPress!". At the time, I was making some decent freelance money from porting botched WordPress builds onto the Umbraco CMS, so my opinion of WP has always been pretty low. Ghost looked like a fantastic publishing tool that was ahead of its time.

Obviously, things have changed a lot since then, and to be honest I never really kept much of an eye on Ghost until two people I used to work with started working for Ghost. Now, Ghost is being pushed as a headless CMS, and seems heavily aligned to the JAM stack.

From what I've seen and heard, this looks like a fantastic release and you should all be proud of this milestone, and just how far Ghost has come. With that being said, there's a niggling thought in my head that won't go away.

What's to stop Ghost from becoming WordPress v2?

<comment><USER2> In theory: Nothing!

In reality: The same thing that has prevented that from happening for the last 6 years; a strong focus on a core set of usecases and no desire to become a generic website builder :)

</comment></comment><comment><USER8> In my experience, Ghost has been the no-nonsense blog CMS that has been stable and just worked with very little maintenance.

I like that they are now moving towards static site JAMStack approach, driven by APIs rather than the current SSR model. This lets anybody to customise their themes with the language / framework of choice and generating static builds that can be cached for improved loading times.

</comment><comment><USER9> Ghost is okay. My blog runs Ghost. I've been using Ghost from about when it was first released, v.09 or something.

I am now planning on moving towards something more static and simpler. Ghost started as a simpler alternative to WordPress, but slightly more powerful than Hugo/Jekyll/etc. It now seems to just be a WordPress clone written in JS instead of PHP. It's still fine and works well... but, I can't see a reason to use it versus WordPress and its lost roots to its simplicity.

I will probably be migrating to Jekyll for easier self hosting and hacking. Perhaps I'll stick with Ghost... but, I'm starting to become weary of "commercial open source" products. Self hosting is becoming harder and harder... it's in their best interest to make you buy the managed solution. It looks like Ghost has transitioned to a product for media corps, in that sense it looks good and I'd use it. For personal usage, I can't recommend it anymore.

<comment><USER10> I'm not sure how anyone can say in good faith that Ghost is "just a Wordpress clone". Even a cursory walkthrough if the dashboard shows this to absolutely not be the case.

</comment></comment><comment><USER11> This is definitely targeted squarely at the publishing industry. Newspapers that have yet to build their own CMS should seriously consider using this to power their digital presence.

This, from my experience as a developer and ops engineer for a newspaper.

</comment><comment><USER12> looks nice. Especially like the membership module and will definitely look more deeply into integration with nuxt.js (wow).

One thing I don't like is that the membership api seems deeply integrated with Stripe only. That's okay for a start but in many countries in this world Stripe is not available (for me it's the new PayPal. E.g. I'm based in Cyprus and Stripe will not work here although it's EU) and I would welcome a better flexibility or plugin system for other payment providers:

[https://github.com/TryGhost/Members/tree/797bab5d9218d7796f0...](https://github.com/TryGhost/Members/tree/797bab5d9218d7796f0b90f47cd908161171bb40/packages/members- api)

Are there any plans for that? Do you think it is easy to integrate other payment providers in future?

UPDATE: ok, I've seen your website FAQ [https://ghost.org/docs/members/faq/#can-i-use-other- payment-...](https://ghost.org/docs/members/faq/#can-i-use-other-payment- providers) I will not support a one payment gateway blog membersite. Sorry Ghost.

Stripe censorship excludes basically (beside regions) also many topics. Thinking about writing about intimate topics, erotica or health? Good luck in using Stripe with that.

<comment><USER2> This is a first version. We're certainly planning to add more payment options, including decentralised ones

<comment><USER13> Yes, but when? Stripe has been saying the same thing. They will support more countries, and yet, three years later they have yet to support many countries.

Don't get me wrong, I understand that a country can not be supported magically. What I'm against are these comments that are written with (what I believe to be) the best intentions.

But then it's posted, and the person who read it, years later is left with a bad taste in his/her mouth.

<comment><USER14> It's open source, there's nothing stopping you from integrating it with the payment platform of your choice and contributing the code back to the project.

<comment><USER13> It is! Oops... I just became that guy :P

But in my defense, it was a general sentiment and not directed to any - one - individual - or company.

</comment></comment></comment></comment></comment><comment><USER15> Serious question.

In the article it writes "all whilst operating as an independent non-profit organisation releasing open source software.".

But this is right before talking about generating $5,000,000 in customer revenue and giving away 0% of the business.

So when you're a non-profit, what happens with that $5,000,000 of business generated revenue? How much of a salary do you give yourself? Can you even give yourself a salary if you label yourself as a non-profit? What makes paying yourself a salary as a non-profit different than a regular business?

Whenever I read sentences like that, it makes me very suspicious. Whenever I see a Ghost blog post talking about the product it always feels like they try to bring maximum attention to being a non-profit in a way that is supposed to be less evil than a profitable business but then you talk about millions of dollars of "business revenue" and I never understood how it works.

<comment><USER16> [https://en.wikipedia.org/wiki/Nonprofit_organization](https://en.wikipedia.org/wiki/Nonprofit_organization)

"A nonprofit organization, also known as a non-business entity,[1] not-for- profit organization,[2] or nonprofit institution,[3] is dedicated to furthering a particular social cause or advocating for a shared point of view. In economic terms, it is an organization that uses its surplus of the revenues to further achieve its ultimate objective, rather than distributing its income to the organization's shareholders, leaders, or members. Nonprofits are tax exempt or charitable, meaning they do not pay income tax on the money that they receive for their organization. They can operate in religious, scientific, research, or educational settings.""

<comment><USER15> That's still very confusing.

Surplus sounds like anything beyond hosting costs to run the service, but the hosting costs is likely no where near 5 million dollars so a majority of it is surplus.

Does that mean no one gets a salary or is a salary part of the costs to run the business instead of being a "member"? If salaries are included who dictates what the income tax exempt salary is?

I'm not trolling either. What you're describing sounds like a way to run a business where you can avoid paying income tax while still getting a salary because realistically I doubt the creator of Ghost is living in a homeless shelter and working off public library computers.

<comment><USER17> Some Business 101 for you: Salaries are separate from profits. Salaries are a cost to the business just like rent and hosting costs. Profits come after all the costs. (Salaries are also taxed as personal income just like at any other business.)

The $5m over 6 years is $833k in revenue per year. Not a lot, and salaries/benefits probably take up the biggest part of that, leaving very little profit. Which is the way it should be everywhere in my opinion.

I applied to work at Ghost a while back and still would love to work for them. Not only do they get salaries, they have amazing benefits (by US standards). Being a non-profit means two things: a) profits are reinvested in the business rather than distributed to owners, and b) Ghost isn't, and can never be, an acquisition target by other companies or investors. That kind of stability is a huge appeal for me, both as a user and a worker.

<comment><USER18> I feel like this comment would be totally complete without the first 5 words, which serve to make it condescending.

Part of the goal of this community is for its participants to learn things they don't know; the tone implied by the intro to your comment makes it seem offensive that somebody wouldn't realize US non-profit status still allows for salaries and benefits for their staff.

[https://xkcd.com/1053/](https://xkcd.com/1053/)

<comment><USER19> I think that to a point this is caused by the attitude in OP's own comments. While it would be nice if it was possible to completely ignore it, I don't think that's realistically possible.

<comment><USER18> Perhaps I'm overly optimistic. I'm also optimistic enough to believe that the comment I responded to wasn't aiming to be condescending; the phrasing was the kind of thing that could very well have sounded jovial in speech among friends. I tend to think that's the more common failing here: people type the way they'd speak if they were having a chat at the pub after work, and a lot of nuance burns off in the speech-to-text conversion.

In any case, the site guidelines ask us to counteract this by assuming good faith, and responding to the strongest interpretation: [https://news.ycombinator.com/newsguidelines.html](https://news.ycombinator.com/newsguidelines.html)

</comment></comment></comment></comment></comment></comment></comment><comment><USER20> Will the fans of Norton Ghost be complaining, the way the Elm MUA people complain about Elm the programming language?

[https://www.symantec- norton.com/Norton_Ghost_15.0_p115.aspx](https://www.symantec- norton.com/Norton_Ghost_15.0_p115.aspx)

<comment><USER21> I had to scroll down before I realised that this is not the disk imaging tool "Ghost".

I've been retired from IT for a few years now - is Ghost (the disk utility) no longer a thing?

I couldn't even guess how many hours I spent sitting in front of this screen: [https://www.dmcinfo.com/Portals/0/vmware-norton- ghost.jpg](https://www.dmcinfo.com/Portals/0/vmware-norton-ghost.jpg)

<comment><USER20> Actually, its the first think I think of too.

Now I use Acronis True Image (which works very well on Windows and I can recover from a dead boot drive in no time!)

</comment></comment></comment><comment><USER22> This article could some background about what Ghost is. There's no explanation until about 6 paragraphs in, and it's only in an image, not in the article itself.

> But you probably want to know about the $5M thing.

No, I'd rather know about what Ghost is :P

<comment><USER23> It's almost like you can chop off the /blog/3-0/ part of the URL and it brings you to a magical homepage that explains exactly that.

Do you really expect them to explain what their software is in every single blog post they make about it?

<comment><USER24> As a general comment, _not in any way related to Ghost blog_ :

> It's almost like you can chop off the /blog/3-0/

It's an annoyance of mine in so many company blogs that going to their actual product is so oddly difficult. Sure, I can chop off the URL because I understand what that is, but what about non-technical users? They understand links, not a damn thing goes back to the core product.

It's so weird to me that so many blogs are built around user engagement and SEO, while lacking back linking to the actual product at all.

I've never understood it, but I see it so so often.

<comment><USER25> You can click on the header without resorting to any URL manipulation. When I load the page, I see ghost, Product, Developers, etc, across the top, and even as I scroll, the 'The Ghost Blog' stays with me, always clickable to reach the homepage.

I'm not sure how going to their actual product could be made any more simple or predictable. Do you have a suggestion?

<comment><USER24> Nope, I'll edit my post - I was merely talking about what the parent comment said, not anything about Ghost.

The fact that they described modifying the URL made me think of so many blogs I see without back links. I wasn't referring to Ghost at all _(I mentioned that, but I 'll make it more clear)_.

Sorry for any confusion :)

</comment></comment></comment></comment></comment><comment><USER26> Congrats!

Slightly off-topic question: Is a handful of the Ghost team based in Bali? I know the team is 100% remote and I've noticed multiple laptops with Ghost stickers at my co-working center.

<comment><USER2> Not permanently, but there were quite a few of us in Bali this year (I think 7 at one point) working from Tropical Nomad. Now we've all moved on again!

</comment></comment><comment><USER27> I was the initial backer for Ghost when it was first on kickstarter, i was very excited about the prospect. But after it release i felt quite cheated. The progress was insanely slow, there were a discussion about responsive images on their github which lasted probably months before anything was done about it. It was very limiting still months after its initial release. Naturally i lost interest.

</comment><comment><USER28> > The hard part is the publishing platform to integrate with the subscriptions > and the billing - that's the part nobody else is doing - and we were getting > pretty good at building a flexible, modern publishing platform.

Doesn't Medium sort of do this? I get that you can't run your own instance or bill specifically for just your content, but otherwise it seems very similar.

<comment><USER29> The two caveats/differences you mentioned are the biggest complaints against Medium. Medium is a fantastic platform for finding an audience when you don't have one already. It's an awesome way to just write and get your work out there.

As the post mentions, Ghost 3.0 is targeted at people like Ben Thompson (in the extreme case) who have an audience passionate/supportive/large enough to pay them directly and who want to own the entire relationship with no middleman.

</comment></comment><comment><USER30> Has the JSON file structure changed in v3? I am trying to migrate from WordPress to Ghost and I was going to use v2, but now that v3 is out, I would like to migrate to v3.

([https://ghost.org/docs/api/v2/migration/](https://ghost.org/docs/api/v2/migration/))

<comment><USER31> It hasn't changed (see [https://ghost.org/docs/api/v3/migration/](https://ghost.org/docs/api/v3/migration/))

But also, [https://wordpress.org/plugins/ghost/](https://wordpress.org/plugins/ghost/) has been overhauled to export from WP into a format you can import straight into Ghost 3.0.

<comment><USER30> That is awesome -- I was looking to roll my own. This will make it much easier.

</comment></comment></comment><comment><USER32> I've never tried Ghost, although their website always appealed to me (one of the best designed website I know). I've been using WordPress for the past 13 years, for personal and also professional projects, which means the familiarity I've built with building custom themes never drew me towards trying another CMS.

But going through this blog post announcement, I saw that Ghost can be used as a headless CMS with frontend frameworks. And since I started using GatsbyJS extensively in the past year, it seems like something that would work _really_ well together.

(It turns out that the official website is actually built with GatsbyJS, so the integration is probably really robust.)

Gonna try it out! And congrats on remaining true to your initial philosophy.

</comment><comment><USER33> Looks great, the payments integration is a great idea.

I've looked at Ghost on and off while considering setting up my personal site, and pricing is the reason I avoided it. I think they started at $5/month for "Ghost Pro" and are now up to $36 for Pro Basic or $99 for Pro Standard (a bit less purchased in bulk). At a minimum, it's now $348/year.

Having paid subscriptions built-in makes that easier to swallow. I don't want any 3rd party ad networks on my site, so subscriptions could help offset the high costs.

Wouldn't help me personally since my site isn't very active and wouldn't get subscribers, but I imagine this will work for some other folks.

<comment><USER34> I self host on a $5/month VPS and it works fine. Granted, I don't really have much traffic, but it sounds like you don't either.

<comment><USER33> Not much traffic, no. But "spend as little time administrating it as possible" was a goal that had me looking into managed options.

Hugo + Netlify is working well, some up-front work in the setup since I didn't want to use a premade Hugo theme, but when I update anything it just takes two commands to rebuild and upload:

        hugo
        netlify deploy --prod

I'll eventually simplify that further since Netlify can run hugo builds automatically from changes to a git branch.

Beyond that, it's just publish and forget. And the page speed is great (Google scores it at 99) since Netlify is serving it off of a CDN.

</comment></comment></comment><comment><USER35> I dig Ghost, but there are any number of client apps (like MarsEdit) that play great with WordPress but not at all with Ghost. Are there plugins that let it support a more widely used API so that it works well with those clients?

</comment><comment><USER36> Fantastic work John!

The membership feature looks amazing and I honestly am very impressed by your landing page since I work on something a bit similar :).

The Stripe Billing integration sounds exciting, but I am curious about the 0% transaction fees. Stripe usually takes 2.9%+30c on charges and Stripe Billing costs 0.4$ (free for the first $1M so we can ignore that).

Did you negotiate some kind of a special deal with Stripe or the 0% means that YOU don't take additional fees, but Stripe fees are still there?

<comment><USER2> You connect your own Stripe account - so whatever fees are there are specific to your setup. They vary widely based on your country, the customer's country, currency and volume. The main difference with Ghost is that there are no additional platform transaction fees - which there usually _are_ with every other product in this space (generally another +5% - +10%. Hope that helps to clarify!

</comment></comment><comment><USER37> The most shocking thing about this post, to me, is that they've only made $5M revenue in 6 years. After expenses, that's got to be a really small profit.

<comment><USER38> Is this low for open source projects? I mean, I'd imagine it's low compared to WordPress.org -- but compared to other projects of its size this doesn't seem low to me.

</comment></comment><comment><USER39> I wonder if taking the JAMStack route won't prevent you to become a real alternative to Medium by making ActivityPub (federation) implementation harder ?

<comment><USER2> Watch this space :)

<comment><USER39> If ActivityPub is the next big feature count me in !

</comment></comment></comment><comment><USER40> Congratulations on the release. I like the direction that they're going and it feels like the only thing that it is missing to be able to replace the backend on a LOT of sites is being able to add some type of custom fields (simple key values) to posts. That combined with the subscription/membership they've added here would be an very powerful platform for many uses.

</comment><comment><USER41> Great to see a new major release! I have used Ghost in a couple of projects, and I am always impressed with the functionality & the flexibility to use it how you want.

The built in editor and admin panel is great, but the real sweetness comes from the REST API. The ability to integrate into any custom website is fantastic!

</comment><comment><USER42> Very cool that I can use Ghost as a headless CMS now. Going to have to give it a try.

</comment><comment><USER43> Native comment system yet?

</comment><comment><USER44> Any plans for a multi tenant setup with memberships?</comment>


Ask HN: I'm 24, coding since 14, and I don't know what to do - <AUTHOR> I'm absolutely lost. I have been coding for so long but I have never had a software development job, I've been self taught and been on this road for so long. Surprisingly I have been extremely active in sports, I'm extroverted, I love being social and coding has been my passion. I can't get a job because the requirements and qualifications is way too demanding even though I am 100% I can handle the work load and delivery whatever it is the companies need.
I did 5 years of PHP, HTML, CSS, Javascript, I studied Java in University, I have done Python, and for the past two years Objective-c/Swift I've built 15 applications.
It is extremely hard in this industry that is changing so fast and it is very competitive.
I really feel like giving up. <comment><USER3> The interview process for engineers is absolutely brutal.

I almost lost hope on my last job jump when it took me three months and six on-site interviews before I got an offer.

What will help you the most in the search is probably not what you think. I thought have a GitHub and some cool projects and a nice blog would make landing a job easy for me... Annnddd 95% of the companies I talked to didn't care.

What helped enormously was studying the same questions that interviewers are likely to pull from. Once I studied hard on interview Q&A I went from no offers to getting three in the same week.

The interview process is usually borderline hazing and the questions being asked have little or no bearing on the actual job. The job requirements listed are actually just some staff engineers wish list of what he would use if he could rewrite the garbage fire that is the application you'll be working on.

It doesn't help that half the time the manager interviewing you hasn't written a line of code for ten years... or ever in the case that you're interviewing with HR.

My theory is that male dominated fields tend to be steeped in competition, or at least the goal is to appear that way. You don't want your hiring to be "weak" and new guys definitely need to "climb the ladder". This makes interviewing for these positions a complete nightmare.

Just keep up applying and remember the interviews are tough on purpose. HR doesn't look good unless they can bring in an endless stream of top tier applicants. Management doesn't look good if they hire "anyone that walks through the door". The result: companies throw away many, maybe most of their good applicants.

<comment><USER4> > What helped enormously was studying the same questions that interviewers are > likely to pull from. Once I studied hard on interview Q&A I went from no > offers to getting three in the same week.

Interesting to hear on what are the sources 'that interviewers are likely to pull from'? And probably some guidelines as well, because interviewers like to be stingy and want to hear _the right_ answers.

<comment><USER3> Study google search results for "interview questions language X" with X being anything mentioned on the application. If js is listed expect things like the difference between == or === and whether variable declarations are hoisted for example.

Other questions I got were things like "can a static class be extended in language X" and other questions that test your trivia abilities but don't really matter when writing code 99% of the time. Like for js, everyone knows not to use == but most people don't know exactly why.

What I did was read several books on the language semantics for my top 2 languages cover to cover multiple times. The process was painful but I was prepared for nearly anything.

Answer quickly even if you might be wrong. Concise answers are perceived as more correct from what I've experienced.

</comment></comment></comment><comment><USER5> Are we in the same industry? 26 here, coding since 11, never got a degree. Decided to develop for a living, managed it within a couple of months - didn't even have a portfolio.

The industry is crying out for developers, theres no reason why you wouldn't be able to get a job. Yeah the industry is fast moving but businesses aren't. If they choose to use a framework, them its going to be in their legacy code base for a good few years.

Remember,you are not paid to develop, you are paid to make the business money. Would you rather hire a developer who wrote an amazing 200 LoC a day and earned you 10k or the developer who deleted 3 lines, sent a few emails and earned you 100k?

Apply for every interview, don't aim too high - you can get a junior position no problem.

<comment><USER6> Same industry, but likely different locations. Despite being quite possibly the most remote-friendly job, availability of software development jobs is still frustratingly regional.

As annoying as this advice might be to someone who likes his/her current home and doesn't want to move, coming to one of the tech clusters and putting in two years where you specifically focus on growing your network will help open up opportunities, establish a reputation and often help you earn a salary higher than you'd get in your local market.

</comment></comment><comment><USER7> I can't really say I know exactly how you feel, but I can safely say I've been in a slightly similar position before. And honestly, every time I look at frameworks like Angular or React, I feel like throwing in the towel right then!

I think it's a good idea to choose a niche, and stick to it. Full-stack devs are awesome, but there's nothing wrong in sticking to a particular competency. Looking at your profile, it seems you're pretty good at writing Swift/Obj-C apps. If that really interests you, why not stick to mobile as a domain? I feel it's easier to keep track of how the ecosystem changes, in one field.

As for jobs. I'm not entirely sure what the problem here is, but I know what it's like to not have the right qualifications. I studied engineering for two years, dropped out because the coursework had zero coding, studied Russian for 6 months and then dropped out again due to campus politics. But I've managed to hold jobs with IBM, Cvent and some media houses simply because I could convince the overlords that the lack of a professional degree didn't stop me from executing what was expected. But it was hard. Have you tried checking out spaces/events where startups converge, and probably pitch your skills to them? A good place to start would be coworking spaces. Establish a relationship with the space's owners/managers, and they'll happily introduce you to teams who need your expertise. Many startups don't care what certificates you've got, so long as you add value. And if there's a startup that does look for a degree - well, you probably don't want to join them anyway.

I hope this helps. Please don't give up - obviously you love writing code, and there's no reason why circumstances should make you give up doing something you love. :)

<comment><AUTHOR> Thank you Sealord, You post means alot,

I would love to stick to mobile apps but majority of companies are looking for "Senior iOS developer" and the funny thing is they list frameworks that literally just surfaced in the tech community, yet these HR reps are asking for seniority and expert levels, on top of that you have things like Superiority in problem solving, x amount of years in agile dev/dev ops principles..etc

This is the overwhelming area, even if I want to do mobile development they ask for things that are senior level!

Your suggestion about establishing a relationship with space owners, and approaching startups is a good idea, I haven't thought about that to be honest.

<comment><USER7> I've got friends who're HR professionals, and I'll say it anyway - they're idiots. I'm yet to see an HR person who genuinely understands how dev ecosystems change, and what they should really look out for as opposed to what their books in business school said.

On an ideal note, try _not_ to go for companies that have HR doing recruitments. It's bound not to work in your favor. Your best bet is to interact directly with product owners because they know what they're looking for, and it's easier to have a direct conversation with them about the best tool/framework for the job. And a lot of startups are liberal - they have "preferred" tools/frameworks, but they're happy with someone coming in with a different option.

Please do try checking out coworking spaces. If there's startup events in your area, try them out too. A lot happens when there's a casual chat over a coffee/beer. I should know, I met my cofounders over a joint.

</comment></comment></comment><comment><USER8> Make some of your code public on Github. Do a web or mobile app or two - <USER2> proof of concept type stuff but it has to be 'complete' in the sense that it should do the job it's supposed to. Use these to demonstrate your programming ability during interviews, and let employers know you're ready to learn new tools.

Pick one set of tools to be your current 'major', say Swift perhaps and spend time getting better at Swift than the rest of the stuff you know. Apply for Swift jobs and be confident!

One more thing. Always be prepared to switch your major to a new one (language, platform). If you ask me, Elixir/Phoenix has lots of potential and 2017 might be seeing a lot of job openings for it.

</comment><comment><USER9> Find a niche and start a company -- solve something you hit as a programmer for example. Expose an API and call it good. You seem uniquely qualified being extroverted and competent. It's a crazy long shot I know but I found that only when I was day-tading (not the same thing) I was happiest because I was earning for myself and making my own hours and best of all trying to see if my hypothesis (or in your case your company) could pass the test in the market.

<comment><USER9> I should add that I lost almost 100k day trading but I learned a few things: 1) my hypothesis didn't work; 2) I loved doing it even given the losses; 3) finance wasn't for me - trading stocks always will be given that it's more-or- less gambling, and who doesn't love gambling -- but it helped me figure out what I wanted to do. The best part was I was my own boss. I woke up at 5AM (willingly!), was often up a few grand by noon, and then left my multi-monitor setup to go have fun for the day. I never felt more in control of my destiny than I was at that time, and I imagine it's the same running your own business

<comment><USER10> >was often up a few grand by noon

couldn't have been that often

>lost almost 100k day trading

<comment><USER9> It wasn't the smartest choice but it was fun and informative.

</comment></comment></comment></comment><comment><USER11> I was in a similar situation, but got an offer and moved to Beijing. Best thing I ever did.

This takes a lot of pressure of since quality is not has strict in the Chinese market, and there is not that many people who have 10+ years experience in CS things. So if you show up with a "let-get-shit-done" attitude, or just a sense of quality, you will be well rewarded.

You can also work on scales that are normally only something for the best and brightest in SF etc. Making day to day task be more challenging and fun.

On the social side, its fun to be an expat, everyone and their grandmother wants to ask you questions and you get a extended family with other expats in no time. The social pressure from home goes away and you hang out with people from all walks of life, on the other side of the world we are all just guests.

China worked great for me, but there is other new crazy markets like Vietnam, Indonesia, Burma. Where a middle class are starting to use their smartphones more and more. All these countries needs localized versions of basic apps, or as in the case of China, niche version of basic apps.

I remember when I was stuck in traffic on the highway back home from work, before China, and thinking if this is it. A change of scenery was all I needed. If you do what you love and it still doesn't feel right, my bet is that you are in the wrong place.

Good luck.

</comment><comment><USER12> Interviews are really a numbers game. The first ten will be rough, then you start to recognize patterns, then you start getting good at them.

Apply to 200 software positions, might be good to start with internships. Every company you can think of, big and small.

Every interview you get, ask the interviewer what they thought of your answer or if there was a better way to solve the problem.

Write down every question you get asked. Google them later to learn the better answers you don't know. After a while you'll know the answer to 90% of the questions most companies ask.

Also sounds like there may be an attitude problem. If you've never had a software development job then how can you be so confident that you can get the job done? That's plain arrogance.

Approach the situation with a growth mindset - you have loads to learn and you can't wait to absorb it all from your peers. This is a lot more encouraging than someone who thinks they know it all.

And if after all this you still can't land a gig, do work for free just to get something on your resume, to get considered at the decent/great places.

You won't get your ideal job tomorrow but through hard work and dedication you can get there in a few years no problem.

</comment><comment><USER13> I'm a PM at Google and former SWE, Twitter: @ninu

Message me and let's talk further. We're always looking for strong SWE applicants. Happy holidays and remember to never give up! <3 for code. 'Tis the season to help others.

<comment><AUTHOR> hahaha <3 thanks ninu, I'm not Google material, that is for the exceptionally chosen and talented.

<comment><USER13> Nonsense. Show us what you're made of and learn to build confidence in your abilities. You never will know unless you try! SWE interviews at Google are challenging, no question, but they're also where you can shine presuming there is a command over the basics (data structures, algorithms, etc). You've built multiple apps and coded in various programming languages correct? Post a link to your Github and let's check it out.

<comment><USER14> Sorry but this is total nonsense and false encouragement. Let me translate what "command over the basics" means:

If you don't know your Floyd Warshall from your Tarjan from your Manacher then you'll just fumble around thinking you got close unless you have the remarkable gift of being able to derive these from scratch in a whiteboard situation. Also I cannot stress enough how difficult - and entirely pointless - a whiteboarding interview is.

edit: I didn't mean this to come across pessimistic and critical. I just think it's important to serve a dose of reality regarding the standard expected (and hopefully some pointers towards the kind of algorithms theory you should be not only comfortable with but also able to reproduce on a whiteboard under pressure).

<comment><USER15> > _total nonsense_

The HN guidelines ask you to edit this sort of thing out of your comments: [https://news.ycombinator.com/newsguidelines.html](https://news.ycombinator.com/newsguidelines.html). We'd appreciate it if you'd err on the side of civility.

<comment><USER14> I've complied and edited it purely out of courtesy even though it is frankly total and utter rubbish, but feel free to knock yourself out with all the rest: [https://www.google.co.uk/search?q=site%3Anews.ycombinator.co...](https://www.google.co.uk/search?q=site%3Anews.ycombinator.com+%22total+nonsense%22)

</comment></comment></comment></comment></comment></comment><comment><USER16> Have you tried approaching CEO:s directly with a phonecall? If you make a good impression that can make a world of difference. Athletism and extroversion are certainly an asset using this approach. If you can program and not just copy and paste stack overflow that should put you at least in the top half of candidates.

Also - coding skills alone are not that hot - they just make you into a replaceable cog. However, if you combine this with domain specialization this could make you into a valuable contributor. And by domain specialization I mean what ever is the core business of a business. Tomato delivery logistics? Insurance policy business rules? Trash truck maintenance database operation? (I'm making this up, but most businesses are run by their own rules and terminology - being familiar how they work gives you the right to claim 'domain knowledge').

I'm 100% sure there is a domain for you to specialize out there. You'll find it if you don't give up. Social skills are probably a really good asset here. Stop talking to HR. Start talking to the upper management directly. Everybody likes to interact with a nice person when they have the time - unless they are lizard people, in which instance they should be avoided in any case.

</comment><comment><USER17> I'm 23, coding since 12. Probably echoing a lot of comments here, but contribute to open source! Not only will it help your prospects of getting a job, you will be helping others which is just as rewarding (if not more). I have only studied 2/5 years of a master in CS, and I get job offers solely based on my Github profile. I don't even have a CV. The industry isn't as competitive as you think. Good developers are rare.

</comment><comment><USER18> I'm in Toronto and we're looking for a web developer now with possible mobile (android/iOS) work in a year. Your post seems like you would be a good fit if this interests you.

</comment><comment><USER19> This may not be what you are looking for, but it is worth considering /not to work in the industry/. I've been coding since the age of 7 and I'm now in my early 30s. There's a lot of programming that can be done outside of this industry (e.g. by working on free software projects), and in some cases it can even be financed through grants.

In my experience a software development job is often the easiest way to destroy what you may love about programming. There may be exceptions, but many of the jobs and their limitations cannot compete with coding out of passion. Jobs in the software development industry are not the only way to make use of and grow your programming skills.

<comment><USER20> Since 1998, I don't think I've ever worked for a "software" company (transportation, HR, healthcare, and logistics make up the bulk of my experience). As a result my code has tangible results, instead of trying to innovate itself into meaning.

</comment></comment><comment><USER21> Some companies work and hire on the "trends"[1] — MEAN stack guy, Elasticsearch ninja. Some companies give more weight to technical soundness and discount the Fleeting Fad of Flashy Frameworks. They focus on solving problems — even if imperfectly so. Although, the job descriptions would sound daunting (they did to me two years back) but in my view, every company that falls in category two should be willing to hear from you. Sincerity, communication, curiosity and great work ethic go long way compared to scant experience in a particular framework.

A cursory look at the everyday applications that companies get would make you realise how you are far ahead of the curve. I would advice you to not get intimated by job requirements and start applying. If they don't reply, try following up (don't worry you are not intruding). Try reaching out to your network if anyone is up for hiring. Get comfortable doing interviews and meeting people. And don't get discouraged by rejections. Companies, after all, are run by people who have their own biases and idiosyncrasies. They might pick up the wrong impression or you might get rejected for a reason that is far disconnected from your coding ability.

[1]: [https://news.ycombinator.com/item?id=11326940](https://news.ycombinator.com/item?id=11326940)

</comment><comment><USER22> > _I can 't get a job because the requirements and qualifications is way too > demanding ..._

You seem overly concerned about this. If a company wants to prevent themselves from hiring someone perfectly capable of doing the job (namely you), then they're probably foolish and you don't want to work there anyways.

On the other hand, it's possible you're mentally hung up on having a desired skill set that's seemingly forever out of reach. If that's the case, just resign yourself to the fact that software development requires perpetual learning in a field where the ground is always shifting beneath you.

Keep in mind that a typical senior developer is just someone who has enough experience to know how to learn fast and not fall victim to common pitfalls in the process.

I suggest finding a job at a nice place to work where you'll be doing something that you enjoy, then worry about the technology stack later. Good companies usually understand that both whiteboard-style interviews and formal degree requirements are bad. The best ones explicitly state that they don't care if you're inexperienced with their stack, so long as you have solid experience.

> _I really feel like giving up._

If that means starting a company as some of the other comments suggest, don't. You're 24. Enjoy your youth while it lasts, don't piss it away doing a startup.

</comment><comment><USER23> I went through a similar phase when I was younger. I had been involved with amateur radio since I was 13 and everything in my life pointed to EE at university. By the time I got there, I didn't see the point anymore. I no longer found it interesting.

Shortly thereafter, I rediscovered programming and I've been doing it ever since (20+ years). In hindsight, I think I had just gone through my first bout of burnout. I still find electronics interesting and enjoyable. So burnout may be one aspect of what you're experiencing.

Since you're an extrovert, you have a natural propensity that many people don't have in this industry. That can be a superpower for you. You might excel at giving talks, communicating with other teams, managing groups, and the like. The fact that you enjoy development and have put in the time means that these activities won't be vacuous.

The feelings of exasperation that you have are similar to what many others-- novices and veterans alike--are feeling. Things change quickly in this field. Many others have written about how to cope with this. It's a real thing but something that can be mitigated and gotten past.

You might consider taking a step back and recharging. The New Year time frame is an excellent time to do so (generally speaking). Think about a few goals that you may want to focus on this year. If you pick a project, choose one that means something to you. It could be one of your own or someone else's. We live in an amazing time of open source and collaboration.

The main thing is, don't worry. You've got plenty of time ahead of you to pick your path and make things work. The fact that you're reaching out and searching for answers is a great indicator of future success. Just keep moving forward.

</comment><comment><USER24> Hi!

Lots of good advice already given out here. But I would like to add some of my own view points

About me : 23, ex-WalmartLabs, currently working on my own startup.

There are many ways to become a software developer, it all depends on what kind of role you're aiming for.

\- Software Developer (SDE)

Typically the job offered to most young grads at the bigs cos (google/linkedin/walmart etc). They want to test your algorithm and programming skills. Check out [0], [1], [2] . It should take you 1-2 months to go over most of this stuff and several more to get really good. Start applying once you have a grasp of the basic principles, perfection only comes with practice.

If you're serious about such roles, I recommend spending at least 3-4 hours a day doing these problems.

\- Technology specialist roles (IOS/Android/Node/Python/PHP etc)

These also require some programming knowledge. Use the above resources and at least do the basic Data Structure questions. Apart from that, showcase your projects, contribute to other libraries and/or roll out your own.

\- Devops

Another cool field to get into. I am not well versed with the requirements myself but AFAIK, you need lesser DS and algo skills here and more tech domain knowledge.

\- Freelance/Consulting

Just keep doing what you're doing right now. Find some consulting firm to market your skills for you. The monthly HN thread might be a good way to find leads/contacts. Can also consider bidding for projects on upwork/freelancer/others.

</comment><comment>===

All in all, only thing I can say is that there's no need to be disappointed. You _will_ get a job. You just need to prepare with a proper plan.

0 - [https://www.geeksforgeeks.org](https://www.geeksforgeeks.org) (Recommended at least basic linked list, trees, arrays, graphs and greedy algo questions)

1 - [http://www.leetcode.com](http://www.leetcode.com) (Do all these questions)

2 - [http://www.spoj.com](http://www.spoj.com) (can also use topcoder for this. Use this to level up your skills and land the high paying jobs )

<comment><USER24> Also, as others have mentioned, do play the numbers game. Apply to as many positions as you can.

Be polite and friendly (lots of rejections happen because of bad attitude).

Would recommend reading Clean Code. Might help you improve the quality of the programs you write during interviews.

</comment></comment><comment><USER25> It depends upon where you're located. Are you looking for remote work? Its far more difficult to get hired for a remote job than to find one that is local to your area. The bulk of remote jobs go to engineers in inexpensive countries not in places like LA and SF with a high cost of living.

<comment><AUTHOR> Toronto, ON!

I agree

<comment><USER25> Yeah probably starting out freelance is your best bet, the old school method of building sites and apps for local business. You might find the local market can work for you if a lot of local businesses still need web and or ios apps.

</comment></comment></comment><comment><USER26> I'm 30 and I'll turn 31 in January. I've been coding since I was 15. Worked in 3 companies till now and currently freelancing. Though I studied Computer Science in College, I learned to code pretty much on my own. I quit my job because I was stuck using outdated technologies and frameworks. I make less money as a freelancer and I don't regret it.

Sometimes you get overwhelmed by looking at other people's success. Sometimes, I feel like giving up too. I feel worthless looking at some people who have achieved a lot before they turned 30. But I've got back up each time I was depressed. Never give up and don't stop looking. Keep building stuff and learn new things. Good things happen to people who keep trying even after failing hard. All the best.

</comment><comment><USER27> Out of curiosity, what's do you find the main barrier to be right now for you ? For example which stage of the interviews do you suspect you have trouble with, and do you have any friends who are already developers that could run you through a few mock interviews ?

</comment><comment><USER28> What's your ideal day-to-day and week-to-week? Directionally, what are your career goals? What impact do you want to have in the word and in business (without limiting thinking to a feature, product, etc.)? What's your work experience?

I'm hiring for customer-facing tech positions at Google (Bay Area) that don't require SWE level knowledge, but require strong practical coding knowledge and relationship management experience.

You can reach out to me at: [https://www.linkedin.com/in/vincentciaravino](https://www.linkedin.com/in/vincentciaravino) if you're interested. Good luck!

</comment><comment><USER29> I know someone who was in a very similar situation and was getting turned down month after month. He made the decision focus on more enterprise technologies (.NET) and invested time in learning and building things with C#. Eventually things worked out.

You mention experience with Java - Maybe going the J2EE route could open some opportunities.

Some may say going down the more traditional enterprise stack is boring but I do wonder if that's where there is more work locally as opposed to work being sent offshore to a low cost dev shop that works with web /php / etc.

Of course I may well be wrong, but it's one perspective.

<comment><USER3> At least in my experience the vast majority of coding jobs are not sexy. I did consulting for a while and maybe 5% of the projects were interesting.

Most of what we did was automate annoying manual processes, which writing the code for was usually annoying in itself

</comment></comment><comment><USER30> Sorry for hijacking OP's thread but I would like to ask the crowd about degree and universities. As for someone outside of the US what are my options? The unis are not equal. Most of them are just meh (good enough). Why would I spend 4+2 years in some place just to get a piece of paper when I am currently earning 65k euros?

The point is in the EU most of the unis are really just not that up to date when it comes to teaching you the real deal ( minus math and cs basics). And they are inflexible bureaucrats.

</comment><comment><USER31> How do you know you can't get a job? Have you tried to apply? Don't be frightened by job postings. Employers tend to ask for the world, including things like requiring 5-10 years of experience in a technology that's only been around for 3 years. Business (at least in the USA, and I think everywhere) is desperate for IT talent. Maybe you won't get your first job at Google or Microsoft, but I'm sure you can find something.

</comment><comment><USER20> > It is extremely hard in this industry that is changing so fast

Doesn't move as fast as you think. Tons of work doing "boring" work. Read what Scott Hanselman says about "Dark Matter" developers: [http://www.hanselman.com/blog/DarkMatterDevelopersTheUnseen9...](http://www.hanselman.com/blog/DarkMatterDevelopersTheUnseen99.aspx)

</comment><comment><USER32> What I did/do is pick something that I like/challenging/be-able-to- grow(backend) + has community/jobs(like python) + doesn't change every six months(like js stuff) + has good working conditions/payment(unlike gamedev) and be good at that. All humans(should?) specialize for better ~everything (doctors!,farming! etc).

Makes sense ?

</comment><comment><USER33> If you have the spare time, find a solid Github project and start contributing to build up your portfolio. Leverage your extroversion and give a couple of expert talks at meetup to showcase your knowledge. Basically use the talents you have to sell yourself.

PS: If I had to pick a focus area I'd do AI. Supply and demand are in your favor.

<comment><USER14> I was discussing this the other day with my friends who are consultants and they jump through nowhere near the level of interview hoops we have to go through. As developers we have a far more structured approach with checks and balances - a compile, build and test process. On the contrary a consultant alone on client site is a far riskier proposition.

</comment></comment><comment><USER34> Have you looked at [https://triplebyte.com](https://triplebyte.com) ?

</comment><comment><USER35> Don't give up! I know it sucks, but if development is your passion keep going. I landed my first job at 27 with no experience and no degree. Now 7 years later I'm so happy my first start up took a chance on me. I see that you're in Toronto have you ever thought about moving?

</comment><comment><USER36> I'm in much the same situation. I decided to travel for a while, so I went to backpackers on the south coast of africa that accept bitcoin. Mind blown. Now I do bitcoin/altcoin trading for most of my income.

Starting to grow my own vegetables aswell so I dont need cash so much anymore.

</comment><comment><USER37> Github. Just open source your app code that you can, and library that you ended up making while doing so. Even as a freelancer or consultant, you will likely to get tons of prospect when you have code in github that is being followed with hundred plus stars.

</comment><comment><USER38> First off, two things;

1\. You can do this and you are not alone! I look good enough on paper that I get a seemingly endless number of job leads. And I still cant make it through the hiring pipelines at seemingly anywhere. I know people way better than me that cant either. The creator of homebrew? Max Howell? Yep, that guy. He couldn't make it through the hiring pipeline at Google. [https://news.ycombinator.com/item?id=9695102](https://news.ycombinator.com/item?id=9695102) It isn't you, remind yourself that it is not you. Just keep going forward. You will get there. You will make it.

2\. But is going to hurt. The hiring pipeline in this industry is broken, completely utterly broken. It will not be fun.

Until you make it, it will be rough. It is just the way it is. There wont be any saving grace or magical advice that will make it all better. It will be rough, it is that simple. Most people outside of the right stereotypes and demographics wont make it. If you don't fit the right demographic you will have to work 3x as hard and suffer 3x the stress and anxiety as others. But the good news is it can be done. You can do it.

First step; figure out what your weakness is and begin to work on it. You can pinpoint this by figuring out where in the pipeline you are continually failing.

Then work at getting a job the same way you worked at learning to program. Getting a job is a skill, don't let anyone or yourself convince you that just because you can code a job will happen. They don't just fall into your lap. You must tackle getting a job with the same motivation, and dedication to self-improvement that you have when learning a new framework or programming language.

If you cant get your foot in the door at companies, if you cant get them to respond to you, then your problem is you look crap on paper. Go and find people that look good on paper, look up the thought leaders, the people whose work you see constantly. Then copy what they are doing. Make open source projects, contribute to their projects, write articles. Eventually you will look good and the leads will start flowing in.

Now here is where it gets harder. If you are failing screens, you haven't learned to talk right. Practice learning how to talk about your work and answering questions (and asking them). Start asking after the screens for feedback. You will eventually learn what you are doing wrong and then you can work at getting better at it.

If you are failing the whiteboard challenge phase of hiring, then get good at them. Go to HackerRank and solve solve solve until things get easier. Recognize that they are puzzles, they are not programming. There is no shame you suck at them, you aren't trained as a puzzle solver, you trained as a programmer. But you have to practice the skills they are testing, and they will be testing you to see how fast you can reverse a singly linked list. Recognize it is silly and stupid, but get good at it anyway.

<comment><USER39> Instead of finding your weakness and patching that up I would find what you are already strong at and take that to the next level. Then just present yourself as only that person. Craft your image to fit your skills not your skills to some image you wish to project. Unless you are highly competent and a really good self study you wont be able to pull off looking like a 10x Rockstar in _blah_ if all you have is a coursera certificate and a really bad GitHub project. If you have 2 years experience and a highly functional app in something else then lean on that. You can always say you're looking for an opportunity to move field/role with a bit of evidence.

</comment></comment><comment><USER40> I had over 7 jobs and only did an interview once.

What helped me: talk to everybody that you are looking for a job. At every party there might be someone who knows someone that needs someone.

</comment><comment><USER41> If you have built 15 applications in 2 years, then that shows some impressive productivity. Why don't you showcase these applications to demonstrate your abilities?

</comment><comment><USER42> How did you perform in the interviews? Perhaps you need to brush up your Algo and DS skills.</comment>


iOS 14 on the iPhone 6S and SE: Performance is fine, other stuff is not - <AUTHOR> https://arstechnica.com/gadgets/2020/09/ios-14-on-the-iphone-6s-and-se-performance-is-fine-other-stuff-is-not/ <comment><USER2> That's clickbait. The article says performance is fine, but their hardware isn't as good as newer phones, so the title should just say "performance is fine", as the second part is neither surprising nor news.</comment>


Ask HN: Learning Advanced Python - <AUTHOR> I've accidentally assumed the role of local Python guru at my current company. Coworkers ask me about best practices, popular libraries, and deployment tooling. I find it very flattering, but I'm really just a tinkerer with a language preference.
Would anyone be able and willing to recommend me some sources to help in answering their questions? In particular, I'd be interested in hearing about:
* Publicly hosted examples of great Python code
* Concise, well-written books that discuss Python best practices and "gotchas"
* Tip sheets and style guides
Thank you in advance for any assistance you can offer. <comment><USER2> I've seen many recommendations for the book 'Fluent Python'.

<comment><USER3> Reading this was really useful for me. It does a great job of going into depth on high level topics like the python data model and also goes deep into lots of more isolated practical topics like covering useful data structures buried in the standard library, a very good discussion of unicode, and concurrency topics, etc, etc.

Python is changing a lot and there is for example no in-depth discussion of the typing module in this book because PEP 484 had only just been written the year before its publication. There's still about four pages dedicated to the topic written as an aside to chapter 11 which discusses interfaces.

Even though it's 5 years old and there have been plenty of additions to the language in that time, I think the book is still plenty useful today -- I still pull it off the shelf as reference from time to time if I'm going into the weeds.

</comment></comment><comment><USER4> It makes me chuckle a little bit that you feel this way, only because I recently took on similar roles in my own career, and, despite working directly with python luminaries for pretty much the last ~5 years, I still constantly question my expertise next to them. (I say this to perhaps lend solidarity/"it might not be as bad as we fear")

That said, let me give some actual answers to your questions.

1\. Good hosted code. I actually asked this exact question to a python core dev a few years ago when having the same concerns you are, and I'll point you to where they pointed me: [0] (Obviously this is only one breadcrumb but it may serve to lead you to more)

2\. This is a hard question since I personally shy away from books as opposed to code samples/going elbow deep. Many moons ago I used to hear "dive into python" recommended a lot but this advice may be very dated, so I'd leave this to other responders who may have more up-to-date advice.

3\. There are a few here; [1] is kinda the "obvious" one if you weren't aware, we also produce a "targeted" version for my dev team (I'll caveat ahead of time, I work for the python folks at MS so I obviously have the bias of this coming to mind first, but this is our style/contribution guide. I'll also be open that we regularly find things we want to detail more effectively, so it's definitely a 'living document.' [2] In an effort to offset some of my bias :P I'd mention that the Google style guides are also notoriously good, although I am familiar with those in other spaces, such as the SRE handbook/C++ style guide.)

[0] [https://github.com/brettcannon/gidgethub](https://github.com/brettcannon/gidgethub) [1] [https://pep8.org/](https://pep8.org/) [2] [https://azure.github.io/azure- sdk/python_documentation.html](https://azure.github.io/azure- sdk/python_documentation.html)

Outside your bullets I'd mention the things that most helped me start overcoming my own concerns about being sufficiently experienced:

1\. Force myself to broach ALL of the aspects I'd black boxed for years. Packaging, _proper_ async practices, keeping myself honest WRT style via black, AST, etc (obviously tune this list towards the things your team uses, the crux of this thought is more, "I used to be fine with a 'pretty good' grasp and some duct tape, I now need to go deeper to actually ensure CONFIDENT knowledge.")

2\. Constructive post-mortems of my own code. Having individuals more experienced than you participate is invaluable, but not necessary. Things like, "what did I miss? What did I do wrong? What here is non-idiomatic or regrettable?" and using that to guide a list of reminders I give myself when doing work in the future; eventually these corrections become muscle memory. This will be very well served by the questions you've asked in your original post.

3\. This may sound silly but in supplementing 2/1/all of the above, actually _keep up with what's going on in python._ Stuff I never did before or thought was irrelevant, reading PEPs, reading email discussion lists, reading debates about parts of the language I've never used or even style/semantic nitpicks all gives me "osmosis knowledge" from other devs, if for no other reason than exposing me to their thought processes, priorities, concepts and mental models.

Don't hesitate to shout if I can clarify any of this, and good luck!

</comment><comment><USER5> David Beazley, Raymond Heddinger, Brandon Rhodes</comment>


Want something better than just Django? Check out Pylons!  - <AUTHOR> http://pylonshq.com/

<comment><USER2> I highly recommend Pylons for Python web development. It's not a "how to build an app in 10 minutes" framework.

I don't see frameworks as tools that novices should use to build applications quickly. I see frameworks as tools that experienced developers can use to eliminate grunt work. I actually like Pylons for not doing too much and giving me choices every step of the way. I can use the bits I need and customize everything else.

But it depends on what you're looking for.

<comment><USER3> Django does the job better. It's not about content, it's the quality of the work.

<comment><USER2> I'm not sure I understand. What does django do better?

Content, quality of work: What are you talking about?

</comment></comment></comment><comment><USER4> I tried pylons not too long ago. I liked the general idea but I ran into several problems. Building the sample didn't work out of the gate and I had to dig around the site to figure out what was wrong. I never could get the user authentication stuff (AuthKit) working with the latest version of Pylons. I finally decided that I'd rather not spend my time debugging or rewriting the framework, even if it does give me more choice.

<comment><USER5> AuthKit isn't the user authentication stuff. It's one guy's attempt at user authentication stuff. Most of us Pylons people ignore it.

<comment><USER4> OK, that's good to know. However, that's my general experience with Pylons. The documentation would seem to recommend AuthKit. For example, see <http://wiki.pylonshq.com/>. The top link is AuthKit. Is there an alternative that you are using?

<comment><USER5> The wiki site was actually originally meant to provide space for many Python projects, not just Pylons, which is why ToscaWidgets is there, for instance.

Generally we roll our own authentication using the session object. It's just as good as AuthKit, and a whole lot simpler.

[http://wiki.pylonshq.com/display/pylonscookbook/Authenticati...](http://wiki.pylonshq.com/display/pylonscookbook/Authentication+and+Authorization)

</comment></comment></comment></comment><comment><USER6> What?

</comment><comment><USER7> The paradox of choice - as a framework! :-)

<comment><USER8> What?

<comment><USER7> Too many choices everywhere. In my mind, flexibility increases complexity and decreases performance. (from an easy to program POV) Pylons is no exception.</comment></comment></comment>


The Great American Fear - <AUTHOR> https://medium.com/@MaximusAurelius/the-great-american-fear-c79a07370747#.t4rdzhs89 <comment><USER2> In all of the author's partisan rants, he fails to include a _single quote_ supporting his perception.

</comment><comment><AUTHOR> If only more people, Americans as well as other around the world, could realize this.</comment>


Make Your Own Latte That Looks (and Tastes) As Good As Starbucks - <AUTHOR> http://www.thegeekscompanion.com/home/make-your-own-latte-alex-leiphart.html <comment><USER2> Yeah so here's the thing. Starbucks is not good coffee. Also he kind of glosses over the whole "brewing" step, which requires special equipment.</comment>


Ask HN: What's the best way to write an API spec? - <AUTHOR> I'm working on a project that contains a REST API, and I want to write out a spec before I start.  Are there tools for this, or should I just make a Google Docs table for it or something? <comment><USER2> I guess I'll take this opportunity to plug my own little tool for this.

I use Swagger [1] and more specifically Swagger UI [2] to generate interactive web-based documentation like the sample at [3].

But rather than relying upon source code annotations to have swagger auto- generate the documentation, or hand-writing swagger's verbose JSON structure, I created a little DSL for it as demonstrated at [4] and available on GitHub at [5].

Let me know if you have any questions about swagger-dsl. It's under-documented right now but perfectly functional. I use it often.

[1] [http://swagger.io/](http://swagger.io/)

[2] [https://github.com/swagger-api/swagger-ui](https://github.com/swagger- api/swagger-ui)

[3] [http://petstore.swagger.wordnik.com/#!/pet](http://petstore.swagger.wordnik.com/#!/pet)

[4] [http://intellinote.github.io/swagger- dsl/demo/live.html](http://intellinote.github.io/swagger-dsl/demo/live.html)

[5] [https://github.com/intellinote/swagger- dsl](https://github.com/intellinote/swagger-dsl)

<comment><USER3> BTW, Swagger-codegen has [support for writing specs in YAML][1] too, if that's your thing.

My team makes uses generated Swagger API docs (via the swagger-play2 plugin), but to be honest the tooling around it is pretty half-assed. Having a machine- readable spec is a game changer, though.

[1]: [https://github.com/swagger-api/swagger- codegen/wiki/Creating...](https://github.com/swagger-api/swagger- codegen/wiki/Creating-Swagger-JSON-from-YAML-files)

<comment><USER2> Thanks Matt.

I looked at swagger-codegen before createing swagger-dsl, and frankly it is pretty nice, but with respect to authoring the underlying Swagger specification document, swagger-codegen is just a direct YAML translation of the original Swagger JSON format.

In other words, swagger-codegen's YAML support is just a YAML-to-JSON transformation. It has the same redundancies and structural issues as Swagger's JSON, just in a YAML syntax.

My objective with swagger-dsl was to create a more human-oriented (more readable, less verbose, less error prone, more DRY, etc.) format for authoring those JSON documents for Swagger. It's not just JSON-as-YAML, it's a more author-oriented (as opposed to parser-oriented) way to describe the API.

</comment></comment></comment><comment><USER4> There have been an explosion of API specification formats in the last few years. No clear winner has emerged.

JSON Schema and JSON Hyperschema are JSON-based formats for describing JSON and REST (hypermedia-driven) APIs. The formats make decent sense and can be used to generate docs, validators, client libraries, UIs, and more. [http://json-schema.org/](http://json-schema.org/)

API Blueprint is another emerging format for API description. It's written in Markdown, so it is very human-readable and -writable. It is not yet suitable for hypermedia APIs. Like JSON Schema, its tooling includes validators, client library generators, mock server generators, docs generators, etc. [http://apiblueprint.org/](http://apiblueprint.org/)

Swagger is a YAML-based format for specifying JSON APIs. It is meant to be created using the Swagger UI, rather than handwritten. It generates pretty docs, client software, etc. but is not suited to describing hypermedia APIs. [http://swagger.io](http://swagger.io)

Slate is an API documentation framework/template, designed to generate very handsome documentation pages. Its concern is more documentation than specification, and therefore doesn't concern itself with things like library or mock generation. [https://github.com/tripit/slate](https://github.com/tripit/slate)

WADL is an API description language which describes API interactions in an XML format. It resembles WSDL. Not many people use it. [http://en.wikipedia.org/wiki/Web_Application_Description_Lan...](http://en.wikipedia.org/wiki/Web_Application_Description_Language)

Which of these is the best? Good question. I like JSON Hyperschema, but I am writing hypermedia APIs and the other formats here are lacking in their hypermedia support. API Blueprint is a nice format to write in a text editor and is easily read as-is or rendered from Markdown; no separate docs generator is necessary.

<comment><USER5> > Swagger ... is not suited to describing hypermedia APIs

Why is that? It wouldn't force/guide you to create a hypermedia APIs by default, but it could be used to document one couldn't it?

<comment><USER4> At least the last time I looked at Swagger, it was very much URL/endpoint- focused. Hyperlinks, while documentable, are not first-class citizens. In a real hypermedia-driven API, you want to document the links, not the URLs, as the API users will be using these named links, and not constructing URLs, to access functionality.

</comment></comment></comment><comment><USER6> There is no single secret to making good API specifications.

But here are few things I've learned:

* The more comprehensive the documentation gets, the the quicker it gets outdated, un-useful, or flat out pants-on-fire lying. Define what the thing does and what assumptions are made, save detail for "gotchas". Be concise.

* Start out on a white board, run through each function, what it should do, what it shouldn't. This really is a huge benefit of spec'ing out a api, just sitting there thinking about it, tons of stuff comes up and you come out with a better product in the end.

* If the format you came up with can't be put into something like a table or spreadsheet, you probably doing it wrong. Sure you can get some sort of framework that lets you create all sorts of UML and create class/function shells or what have you, but I have never found these to create value or clarity. If you are spending more than 20-30 minutes outlining even a complicated function, your probably wasting time. Use time saved to create a clear system-wide DFD.

* Don't go deep into implementation detail at this stage, but at least think about it. Some much time can be saved with a little forethought here.

</comment><comment><USER7> I used apiary.io which is the best tool I've found for writing API specs. You can write your specs using an online API Blueprint format editor via their site. Alternatively, you can put a text file in your repo and authorize apiary to pull the file every time you make a commit to github. This way you do everything via your development environment.

The documentation they provide based on the specs looks very well designed and intuitive.

One of my favorite features about apiary was the mock backend server they use based on my API specs. So if you're doing a single page app, just write your specs then point your frontend app to the mock server they provide. This greatly simplified development process for me.

</comment><comment><USER8> Here's a summary of the discussion (RAML vs Swagger vs Apiary vs RSpec...) we had at Lonely Planet: [https://lonelyplanet.atlassian.net/wiki/display/PUB/API+Spec...](https://lonelyplanet.atlassian.net/wiki/display/PUB/API+Specification%2C+Automated+Testing%2C+and+Documentation+Generation+Discussion)

5 months in, we're happy with API Blueprint. We used to use Dredd for API validation but ran into to some limitations:

\- Dredd does not perform any validation against the siren response beyond the first key level. For example, it does not validate if the class-name is user- events, or usr-events

\- Dredd does not make any difference between Action parameters and Resource parameters. Then, an action POST to create user-events will have undesired url parameters. E.G: POST /user-events?take=0&skip=2 (The apib blueprint specs allows to make this difference: [https://github.com/apiaryio/api- blueprint/blob/master/exampl...](https://github.com/apiaryio/api- blueprint/blob/master/examples/7.%20Parameters.md#all-my-messages- messageslimit))

So one of our devs created a Ruby validator, [https://github.com/nogates/vigia](https://github.com/nogates/vigia). See [http://engineering.lonelyplanet.com/2014/11/18/vigia- integra...](http://engineering.lonelyplanet.com/2014/11/18/vigia-integration- tests.html) if you're interested.

<comment><USER9> Hi, I'm Dredd developer and here are my comments on Dredd - API Blueprint testing tool:

\- Dredd does not perform any validation against the siren response beyond the first key level. For example, it does not validate if the class-name is user- events, or usr-events

This I can't confirm, presence of object keys is validated on any level.

\- Dredd does not make any difference between Action parameters and Resource parameters. Then, an action POST to create user-events will have undesired url parameters. E.G: POST /user-events?take=0&skip=2

This is true, but it's by design. In Dredd URI parameters are inherited from resource to action, but there is no way how to filter out unwanted parameters from resource under action section.

In this case I assume that `skip` and `take` parameters belong only to GET action (retrieving collection), so its imho a non-sense to discuss them on the resource level because they will be propagated to any action under that resource.

Thank you for very interesting feedback!

</comment></comment><comment><USER10> Disclaimer: I work for Apiary.

API Blueprint [1] is an open source API description format which can be used to intuitively describe an API.

MSON [2] is a recent addition to the above format which makes it easy to describe all kinds of complex requests and responses in the spec.

You can email me at pavan [at] apiary [dot] io if you have any more questions.

[1]: [http://apiblueprint.org](http://apiblueprint.org)

[2]: [http://github.com/apiaryio/mson](http://github.com/apiaryio/mson)

</comment><comment><USER11> Like others, I use the Apiary's Markdown format, using aglio to generate a HTML page from it. I also use Protagonist to convert the documentation to a JSON object that Python code can consume and verify that there's a 1:1 relationship between documented and implement API endpoints, as well as as arguments passed. There's room for further validation as my API endpoints have type checking and permissions declaratively configured (via Python decorators).

I tried RAML -- it makes sense for quick prototyping of your resources and methods, but I oculdn't see myself writing too much documentation as a giant nested YAML document.

I also tried apidoc which might make sense of you have internal documentation you wan to quickly expose. However my docs are longer than the code implementing them, so I don't like mixing them in as e.g. apidoc would require. I'd prefer lots of English in my documentation and it seems odd to conflate hints on how to use an API call as an external user with the implementation of it. Compare Sphinx-generated Python docs with some auto- generated python library documentation.

The apidoc versioning system is pretty cool, though if you are making a public REST API backwards-incompatible version changes should be avoided.

</comment><comment><USER12> Write some client code for how you want to use the API and then elaborate those examples by making references to the spec. This might seem backwards to you but you'll discover all sorts of edge cases and awkwardness in the process that you wouldn't have discovered by just writing the spec.

You don't need any special tools to do that although apiary comes to mind as something worthwhile.

<comment><USER13> +1 on starting with use cases. Write the client code you'd love to write, and then figure out what API will make it possible.

</comment></comment><comment><USER14> Have a look at [http://apiary.io](http://apiary.io) and [http://readme.io](http://readme.io)

<comment><USER15> Hey, thanks for the tip. ReadMe.io cofounder here, happy to answer any questions about my service or API specs in general.

ReadMe.io currently focuses more on the "front end" of the API. We can ingest in-line comments made with the apiDoc.js [1] standard, and then use that description to build an API explorer and reference docs automatically. We like apiDoc because of how concise the comments are, and because they are kept very close to the code (no extra files to maintain). It's not as common as some of the other standards mentioned here, but it's — by far — the fastest and most straightforward way to describe an API.

[1] [http://apidocjs.com/](http://apidocjs.com/)

Edit: this is how it's implemented within ReadMe.io: [http://readme- sync.readme.io/v1.0/docs](http://readme-sync.readme.io/v1.0/docs)

<comment><USER14> I like apiDoc, too, and I spent a few days adding those comments to my code.

However, it's been months now, and the GitHub Sync section still says "temporarily disabled".

Is this feature really done? When can I use it?

I'm a bootstrapper and understand testing features by pretending they exist, but it's been a pretty long time...

<comment><USER15> Hah, touché. It's 98% done and only requires a little bit of usability polish before going live. You can shoot me a note (support [at] readme.io) with your project subdomain and I can enable it for you. Appreciate it!

</comment></comment></comment></comment><comment><USER16> 1) The best tool is probably RAML. It's very succinct, looks like YAML and has powerful features such as traits that really simplify the process of documenting many endpoints with similar traits (e.g. pagination). [http://raml.org/](http://raml.org/)

2) Swagger is an older option that is quite verbose but has a lot of good tooling support.

3) A third tool that is pretty decent is API blueprint.

Disclosure: I did work on an open source swagger-raml converter about four months ago.

</comment><comment><USER17> After working on a couple API's used by mobile devices I would recommend starting with some static pages containing JSON, then write a client against them first. That will help verify that you have all of the needed data and the format is correct.

Once the format is nailed down it's easier to write documentation, and the server side code will go quickly because less time is spent iterating changes.

</comment><comment><USER18> We used to start with Aglio ([https://github.com/danielgtaylor/aglio](https://github.com/danielgtaylor/aglio)) and the API Blueprint format 1A ([https://github.com/apiaryio/api- blueprint](https://github.com/apiaryio/api-blueprint)) provided by Apiary. We recently moved from Aglio to Apiary.

</comment><comment><USER19> I've really liked using Apiary [http://apiary.io/](http://apiary.io/) It lets you build sample output and URI address for your API's, document multiple routes, and stores everything nicely on your account on their cloud. I've used it for 2 projects this year already and have really liked it.

</comment><comment><USER20> Writing tests for your spec is probably the best way. You get to test the design of your API (and any edge cases/scaling issues) before you actually have to design it, and, bonus, when you're done you have a full suite of tests.

</comment><comment><USER21> We tried a lot of options at Lavaboom (including apiary, readme.io, swagger, etc) and ended up using Slate: [https://github.com/tripit/slate](https://github.com/tripit/slate)

<comment><USER21> We ended up with Slate because:

1\. readme.io is just painful to use for larger documentations; very GUI- oriented 2\. apiary is basically just annoying in every way (I really like the company so I tried 3 separate times to get myself to like their product) 3\. I dismissed a couple of self-hosted options that use JS to render the information, since I find that idiotic

Slate struck a good balance between (1) syntax (2) ease of use and (3) good looks, although I wouldn't call it prefect in any of those departments.

Disclaimer: the end result looks surprisingly better than what you'd expect.

</comment></comment><comment><USER22> My former colleagues have been working on [http://apidoc.me/](http://apidoc.me/) ([https://github.com/gilt/apidoc](https://github.com/gilt/apidoc)). I really like this approach, which is basically:

1\. specify the api in json 2\. apidoc generates really nice api documentation 3\. apidoc generates a single-file client for the service (currently ruby or scala) 4\. apidoc generates a routes file for play2

It's scala-biased at the moment because that's their tech stack, but in practice an api-first approach seems to lead to higher quality APIs compared to just hacking something together and annotating it to extract docs. Also having a really nice client without a complicated compile-time dependency graph (on the JVM) feels like a sweet spot.

</comment><comment><USER23> My vote is definitely for swagger. Besides being a great way to write API spec, it has tons of tooling to take a given spec to the next level. See the list at [https://github.com/swagger-api/swagger- spec](https://github.com/swagger-api/swagger-spec). My favorite is Swagger Editor which allows you to write a spec in YAML and shows you consumable API in real time.

There also exist an opens source project that has Swagger at its core called a127 ([https://github.com/apigee-127/a127-documentation/wiki](https://github.com/apigee-127/a127-documentation/wiki)) that allows you to build enterprise-class APIs in Node.js locally and deploy to any PaaS where you can run a node app.

 __Disclaimer: I work with a127 project.

</comment><comment><USER24> Isn't this why enterprises favoured things like SOAP web services with XSDs and WSDLs? The verbosity acts as human and machine-readable documentation, and the files can be used to generate client code.

Ignoring the benefits of using HTTP as the request transport mechanism, this seems like another cycle of people coming up with a comprehensive but complex solution, other people getting frustrated with the complexity and developing a simpler solution, then filling in the gaps (such as documentation) until the solution is a complex patchwork of competing libraries, none clearly better than the others, leading to fragmenting of mindshare and expertise...

</comment><comment><USER25> At Willowtree, we created Monkeypod ([https://Monkeypod.io](https://Monkeypod.io)) to serve as an API design, documentation and virtualization tool.

It uses Swagger and swagger ui extensively and can output (and soon input) Swagger specs. It creates a virtual API based on the design you create, and you can play with it from Swagger ui sandbox or any Http client.

We have a lot of cool features on the roadmap. Feel free to sign up and give it a try. Let us know what features you'd like to see. Cheers!

</comment><comment><USER26> It looks like there are some options out there for REST APIs.

Does anyone know of any API specs written for websocket APIs?

I am working on creating a websocket API and would like to at least look at a few other examples.

<comment><USER27> This is something I am looking for as well. In my case I'd like to integrate a REST API with a Push Notifications API in a unified API specification. Today I have resorted to using JSON schemas/hyperschemas with custom templating using the Heroku's prmd tool. Works ok but has the drawback that it relies on my custom made templates...

</comment></comment><comment><USER28> I always start "backwards" by writing some example code.

</comment><comment><USER29> I wrote about a few of the different formats before: [http://pedro.by4am.com/past/2014/5/23/get_more_out_of_your_s...](http://pedro.by4am.com/past/2014/5/23/get_more_out_of_your_service_with_machinereadable_api_specs/)

And been working on a tool to merge the schema with actual code for Sinatra apps: [https://github.com/pedro/sinatra- schema](https://github.com/pedro/sinatra-schema)

</comment><comment><USER30> Regardless of solution chosen, Swagger or otherwise, I'm puzzled as to why people integrate the API spec/documentation into their source code. Seems to me to provide incredible scope for bugs and dramatically increase software complexity: [http://fourlightyears.blogspot.com.au/2015/01/swagger-is- gre...](http://fourlightyears.blogspot.com.au/2015/01/swagger-is-great-but- integrating.html)

</comment><comment><USER31> You may find my comment in a related thread interesting: [https://news.ycombinator.com/item?id=8847072](https://news.ycombinator.com/item?id=8847072)

I was discussing my interest in documenting an API and then generating client libraries, API tests, and other artifacts automatically. Some relevant tools and projects were mentioned/discussed.

</comment><comment><USER32> I use [http://apidocjs.com/](http://apidocjs.com/)

You define the API in comments within your code. When you run apidoc it scans your code and generates pretty documentation.

I tried various other solutions before this such as apiary.io. Apidocjs is really easy to update as it is part of your code, which also means it goes into your version control!

</comment><comment><USER33> Restlet Studio ([http://studio.restlet.com/](http://studio.restlet.com/)) let's you visually craft your REST API and then view it as Swagger 2.0 or RAML 0.8 source code by simply switching tabs.

It is entirely free and available as a simple web app and installable as a Chrome app. Disclaimer: I work at Restlet.

</comment><comment><USER34> We've just started designing a new api and gone done the json-schema path which is particularly suitable since we're using json-rpc over websocket / http post.

Aside from that whatever tool you use, having markdown as the base source is really useful as you can then display it however you want while still quickly read it in a terminal.

</comment><comment><USER35> May I say, look at SpyREST (SpyREST.com) if you consider developing the API first and then produce the documentation automatically simply by exercising the API? This is an open-source tool, feel free to take a look.

I'm developing SpyREST and will be happy to discuss if you want to learn more.

</comment><comment><USER36> I can't be entirely sure that it's to do with the tools used (I'm familiar with most of the ones mentioned in the comments) but my most successful API designing, at a high level, has been in a spreadsheet.

</comment><comment><USER37> Why not model your REST resources so that API documentation can be auto- generated from your actual code? Makes a lot more sense to me than trying to generate code from documentation.

</comment><comment><USER38> I use Cucumber to write the API spec for our hypermedia API, it doubles as an end-to-end test which guarantees that the specs are never out of sync with our API implementation.

</comment><comment><USER39> I would follow the RFC and the Unix manual layout. I normally use XML to write my documentation, and simple xslt to convert them to roff to produce text/plain and pdf and html.

</comment><comment><USER40> use something like capybara or Rspec Testing (rails ) to stimulate a real user behavior</comment>