Ask HN: I'm afraid I will always be a mediocre developer - <AUTHOR> Hi everyone!
I'm afraid I will always be a mediocre programmer. How can I become better?
Everyday on HN I see some coder come up with an amazing algorithm/piece of code/software, and I think to myself "WOW, that is brilliant" and the next thought is "I will never be as good as these guys".
Can you give me any advice?
P.S My daily job involves php/js, but I'm trying to move on from them to some other language (Learning GO now).
Thank you. <comment><USER2> Let's say for a minute that there are only 1000 developers that post stuff to HackerNews. Each of them only needs to make something neat once every 3 YEARS for the the front page to have one instance of brilliance every day.

Now imagine there are 10k developers that post stuff to HN. Each would only need to produce something amazing every 30 YEARS to get something on the front page!

It's hard to see your own improvement -- your day-to-day performance doesn't seem to be any different. On the internet, it seems like everyone is doing cool stuff all the time and you are falling behind. You aren't alone, I get this feeling all the time; we are always our own toughest critic and usually the last ones to praise ourselves.

So don't sweat it! If you make something awesome in the next few years, you are ahead of the curve :) Why not start today?

Take an hour this week to look back at your own year's accomplishments and I think you'll find that you've done and learned more than you thought.

<comment><USER3> Totally agree with this. Learn by doing. Just create something, drop some acid, create some more, and sooner or later you'll find that you accidentally built something spectacular.

<comment><USER4> Drop some acid? Yeah, I guess you could, but it's far from a free ticket. Besides, it's really easy to be creative without it.

There's just one thing you have to do -- think.

Just always keep your eyes open to the things that don't work as well as they should, and _work_ to improve them. Just start. Start small. Build out the core, then go bigger. Let it consume you.

A million great ideas come out of any kind of work you feel passionate about. Just find something that sucks and improve it. Once you get the ball rolling you'll have more ideas than you could build in a lifetime.

<comment><USER3> It was more or less just a funny, but not so well-received. So hard to convey lols through text.

But, your point, _it 's really easy to be creative without it_, I would argue against.

You can't teach creativity. You can't learn creativity. Creativity is something you're born with and developed subconsciously. You can't consciously be creative. You can consciously think out of the box, sure, but as a __true __creative individual myself, there 's such a fine line between the two.

<comment><USER5> I don't agree, you CAN learn creativity. Watch this great lecture from John Cleese from 1991: [http://vimeo.com/18913413](http://vimeo.com/18913413)

<comment><USER6> You should post this on the front page

</comment></comment></comment></comment></comment></comment><comment><USER7> I'm 37 , unemployed and took up 'coding' as a means to pull myself out of what by U.S. standards is poverty. No healthcare and I live basically in a hole in the wall of this ladies trailer. I don't know how you can become 'better' but if you ever want advice for dealing with sever hopelessness I can help. First be grateful that you hierarchy of needs are met. Presumably you have health insurance thus if you have say, a rotting tooth in the back of your face like I do...you could probably get it checked out before it infects the rest of your system. After being grateful, the next thing to do is realize that nobody gives a flying fuck what you do and the world is cold. This will allow you to truly realize the opportunities you have as your dispose and put your gratitude on overdrive when any anomalies of concern do seem to present themselves. Next, exploit every resource you have to 'get better'. The computational power of a mac mini is actually quite a lot in the context of the computer market over the last 20 years. Don't look at as programming, look at it as turning nothing into something. If you want to 'get better' first find out exactly what you are not good at! Are you a great programmer but are shitty at being "creative"? Are you creative but can't seem to express it through code as much as you would like? Are you bad at reading other peoples code? etc etc etc. Blatant honesty about what exactly your weak points are can force you to zero in an fix it but first you might have to conduct a self- imposed research project to even figure this info out. Anyway, don't take this post too seriously, I'm a nice guy really. I just felt being a bit brash and off the cuff for a moment. I'm sure you'll continue to achieve. bye bye

<comment><USER4> Sounds like you're in a rough spot. Hope things improve.

<comment><USER8> Sounds like he's in the right place, too! :-)

</comment></comment></comment><comment><USER9> Specific advice: read, study, and practice SICP:

[http://mitpress.mit.edu/sicp/](http://mitpress.mit.edu/sicp/)

[http://ocw.mit.edu/courses/electrical-engineering-and- comput...](http://ocw.mit.edu/courses/electrical-engineering-and-computer- science/6-001-structure-and-interpretation-of-computer-programs- spring-2005/video-lectures/)

It's a book that will permanently upgrade your perspective on creating software, in a way that's language-agnostic. To start, get and install MIT- Scheme and Emacs, then follow along with the videos. And/or dive into the book and do the exercises.

</comment><comment><USER10> If you feel mediocre then you probably aren't being challenged enough in the role you are currently in. You aren't going to be writing code to send rockets into space if you aren't working for a company like SpaceX. You can try working on stuff like this in your spare time (which you may have to do to land such a position,) but nothing will advance you in that area like doing it as your bread and butter will. If you want to be working on big problems, then you have to go where the big problems are. Always be looking for your next opportunity to level up.

Also, history makes legends. People don't feel like legends at the time of their making. Some of the greatest stories in tech were created by people who were mediocre coders, had no idea what they were doing and probably wouldn't have been doing it if they knew any better. The reason these people turned into legends is because they nailed far more important elements than brilliant coding. They could sell, they could market, they could ship code and they were relentless. Grinders are ugly, but they are the engines that drive the world.

<comment><USER11> That's great piece of advice. There's a big difference between being mediocre and working on (what seems to be) mediocre project.

</comment></comment><comment><USER12> Im surprised nobody has mentioned that this is a case (or variant) of "Impostor syndrome" (from Wikipedia [1]):

"The impostor syndrome, sometimes called impostor phenomenon or fraud syndrome, is a psychological phenomenon in which people are unable to internalize their accomplishments. Despite external evidence of their competence, those with the syndrome remain convinced that they are frauds and do not deserve the success they have achieved. Proof of success is dismissed as luck, timing, or as a result of deceiving others into thinking they are more intelligent and competent than they believe themselves to be."

Feeling "as if you don't belong" or that you were falsely placed in a position (by accident, etc.) is a very common feeling among high-achieving students and adults (common, for example, in medical schools and graduate programs).

to the OP: you are clearly achieving success in your career (know several languages, challenging yourself to additional), and the fact that you read HN and have a sense of what makes a project great is important. There's been good practical advice elsewhere in this thread, but I feel that it's important to point out that your underlying feelings fall under a broadly typical pattern as well.

[1]: [http://en.wikipedia.org/wiki/Impostor_syndrome](http://en.wikipedia.org/wiki/Impostor_syndrome)

</comment><comment><USER13> I'm afraid I will never be a software developer. Seriously I am not sure I'll ever be able to make a living developing software. This makes me sad although not that sad, from this realization I just get a "man this sucks" feeling. I'll keep doing what I like until I die, and I like computers. I write code just for fun and because I want to solve my own software needs. I have zero discipline, sometimes I spend weeks with out learning anything about programming, sometimes I am on a learning sprint and I read so much I get sick of it. Right now I am at college studying on a related subject but I don't know if I'll even be manage to pass this semester. I don't really care I am to much of a hedonist, I should be doing homework and here I am slacking in the internet. As I say why worry you'r going to die anyways. If I fail fine, if not even better. Seriously when humans are extinct not even the greatest of us will be remembered. Do what you like and try to be happy, if you can become a great programmer you will, if can't you won't. Whatever can be will be, whatever can't be won't be. Our actions affect our future but there is a limit to what we can hope to accomplish.

TLDR. Try your best and stop worrying about the outcome. If you can become a great programmer you will, if can't you won't.

<comment><USER14> Sounds like you need to find something so worthwhile you'll work to support it. That might be a sort of work itself, a team, a family... Good luck, I hope it's the work you end up doing that you love so much!

</comment></comment><comment><USER15> The other commentators haven't mentioned the fact that perhaps you could instead try to accept the fact that there is nothing wrong with being mediocre. By definition, most people are. Try to look into why you fear being mediocre? Also, perhaps you just happen to perceive yourself as mediocre? Sometime the want for change is the ill that needs to be addressed, and not the perceived faults in yourself. Good luck however you proceed!

</comment><comment><USER16> First off, look at some of your older code. How recently can you go back and look at some of your older stuff and thing, "Wow! I wouldn't write it like that now!"?

If it's not more than a year or two ago, then you're a constantly improving developer and I wouldn't be too concerned. However if you're still writing things exactly the same way 5 years later, you're either not learning, or you've got some awesome niche where you're almost the only VBA developer in your town and you're charging out at $1000+/day. ;-)

For me, probably 90% of the time, I love programming for the fact that there's always cool stuff to learn. But the other 10% of the time, I hate programming because you've always got to learn new stuff. (only half-joking... so it's realistically 5%)

It's an awesome field to be part of. You don't necessarily need to compare yourself to the gurus. I'll never ever be a Carmack/Torvolds/Knuth... But in my field, I'm pretty decent and am appreciated by my clients.

And the day I stop learning is the day I'm dead.

<comment><USER17> wow, awesome reply, thanks. That's almost exactly how I feel about the subject.

</comment></comment><comment><USER18> I do not know how you can be a better programmer aside from simply doing a lot of programming, thinking about programming, solving problems, and following your interests down the rabbit hole of gaining knowledge.

I can, however, offer you some take-aways I've come up with trying to answer that question for _myself_. Though I caution you that adopting my solutions to the problem are as likely to help you as wearing my glasses is to correct your vision. (they _might_ be the same prescription but probably aren't)

Firstly, commit yourself to stop comparing your life to the best parts of other people's lives. You get to read about the successes of others, it's far less common to read about their failures. (Unless the failure is presented as a contrast or starting point to show off a later success). This skews your thinking into believing that everyone else is producing all this wonderful stuff while you're just grinding out crap.

Compare yourself against your past self, not other people. Bonus points to commit to that comparison across every aspect of your life and not just your programming ability.

Secondly, decide what you mean by being a "better" developer. What does that mean exactly? The ability to work in multiple languages? Having a deep knowledge of one language? Having a large portfolio of completed projects? Something else?

Do you even really want to be "better" or do you really want recognition or more money or something else?

Thirdly, take the long view and take small steps consistent with achieving your big goal. Example: if you want the ability to work in multiple languages, take the small step of choosing ONE new one and spending 6 months or a year digging into it. Think of a fun little project and see if you can implement it using that language. Repeat that step for a different language for another 6~12 months. How many repeats/years of that will result in you become proficient in multiple languages? If you want, you can combo that with writing up your experience in a blog presenting it to a tech group... it seems to me that combo cold easily result in gaining reputation, expanding your portfolio, opening you up to job offers (more money), etc.

What do you care if it takes you 5 years to accomplish all that? What else were you going to do with that time? (and if using that time for something else would have a higher value for you then forget about being a "better" programmer and instead spend the time on whatever else fulfills you and makes you happy)

</comment><comment><USER19> Like many here I've been a developer for ages (30+ years in my case). I know loads, and there's loads I don't know. Sometimes I feel like i'm a freakin' genius, other days like I should probably pack it in.

It's how we're made (humans).

Note that most of the stuff companies release isn't all that special. But it sells. Programming is never really going to be 'won' \- marketing wins all the time. A lot of what you see around you is actually marketing. Just cover your eyes and do your best :)

</comment><comment><USER20> Keep working. I've been a developer for over 25 years and still learn something new almost every day. Working in other languages will definitely help give you new perspectives.

I don't know if anyone reaches a point where they feel they are "brilliant" developers. Maybe if they have a big ego they do. I'm competent in certain niches, and I think that's all most developers are.

<comment><USER21> How can you learn something new almost every day? Can you give a couple examples?

</comment></comment><comment><USER22> > "P.S My daily job involves php/js, but I'm trying to move on from them to > some other language (Learning GO now)"

It's less about the language one uses and more about how one uses it to implement the ideas one comes up with. Amazing things can be done in any language, just some make certain ideas easier to implement than others. However, exposure to various languages (especially ones outside of the paradigm one uses the most) helps with becoming a better programmer. I'd say it would help you to have some exposure to functional languages more than Go will help. Try using a Lisp variant (common lisp, scheme, clojure, racket, etc), F# or haskell. You'll learn a number of things you can apply to imperative languages such as PHP and JS (such as lambdas/closures, monads, macros and you'll better understand recursion as well).

</comment><comment><USER23> Getting better for the sake of getting better does not scale. Is there anything you would like to do? any project? best ideas come when you are doing something and realize that whatever you are doing could be done better. Listen to your "what if.."

<comment><AUTHOR> Now that you mention it, there's a project I wanted to do, but dismissed it because it was too big, maybe I will try and build it. Thanks!

</comment></comment><comment><USER24> First of all, it's so great that you have a desire to get better. That alone puts you ahead of most people. So, how do you actually get better? Take an inventory of your weaknesses. Now eliminate them, one by one. Next, start building stuff in your spare time. Read code on github, fork repos, create your own. A lot of what you make won't be good, but keep at it. Over time the projects that you keep working on will improve, your weaknesses will be eliminated, and you'll be doing side projects that stretch you. If you keep at it you'll be great at whatever you set out to be great at.

</comment><comment><USER25> Identify some great programmers that are solving problems similar to the ones you are working on and mimic them. Ruthlessly. If you fall short then try again and repeat until your solution is at least approximately as good as the best you have seen. If you ever exceed the programmers you mimic, find someone even better.

Due to the nature of programming it involves solving new problems all the time so there will in general almost always be someone better than you at solving problems that are important to your current project.

<comment><AUTHOR> How would I go about finding great programmers to follow?

<comment><USER26> Look at the libraries you're using. For me, it was caolan/async. One evening, I sat down and thought about how he was doing it and I recreated all the most interesting features without looking at the code. In passing, I found a lot of opportunities to add more cool features, so I did. It was an enlightening experience, even if no one ever uses my piece of code.

It has also been mentioned by almost every single recruiter I've talked to since I posted it to Github.

<comment><USER25> I second this. Looking at the libraries you are using have many positive effects; its due diligence, its relevant and a great way to learn more about the power of your dependencies.

Personally I also try to discover best practices on how to solve problems in my domain, and learn why they are best practices.

</comment></comment></comment></comment><comment><USER27> A brilliant programmer can get noticed across all of the internet.

Paying attention to the smartest and most accomplished people on the internet and matching yourself against them is likely to be hard on your ego. I recommend not doing this.

Getting better than you used to be is a more reasonable goal. (In lots of things, not just programming.)

On the programming side, studying Go sounds pretty good. Give yourself an attainable-seeming project and go after it. I think pg recommends picking something you think you can finish in a month--that sounds pretty good to me.

Good luck.

</comment><comment><USER28> It is not about being brilliant but about solving the problems that get on your path while making something.

When I want to learn something new or a new language I always set up a project that seems interesting to me, this will force me to solve all problems along the road towards completing that project, when done I often know enough about the language to go ahead and use it in the real world.

You learn from mistakes but most from other people's mistakes.

</comment><comment><USER29> "Hi everyone! I'm afraid I will always be ugly. How can I become prettier?

Everyday on E! I see some model/movie actress and I think to myself "WOW, she is gorgeous" and the next thought is "I will never be as good looking as them".

Basing your self worth on comparisons to those you see in media is the road to ruin. Don't sweat it, and realize that you are seeing the best people on their best days on HN.

<comment><AUTHOR> Should I not try and measure up to the best people on their best day?

<comment><USER30> IMO you should aim a little higher, just know the road might be long, and keep your nose in it.

</comment></comment></comment><comment><USER31> Being a great developer can mean many things. There are many kinds of trees and they grow different, and produce different fruits and nuts. The question is how you grow and maximize what you can do.

I would suggest a couple of things.

\- the first habit great developers of all stripes must cultivate is self- introspection and an effort to solve problems of one's own coding style and approach.

\- the second habit of a great developer is to focus on producing great documentation for your code. This is important because it helps you see the code from a less immediate and more long-term perspective.

Those two habits are the most important (and most frequently missing!) habits regarding development of development skills I can think of.

In my experience if you are deeply introspective of your own code quality and your documentation approach, you will develop a clear vision of problems that will make you a part of breakthroughs you hadn't foreseen.

</comment><comment><USER32> Mediocre programmers (or members any other profession really) will never realize or admit their own mediocrity. The fact that you've done this, and are actively trying to improve, already puts you ahead of most. Don't have any specific advice for you though. Just thought you could use some encouragement.

<comment><USER30> I don't agree with this, because I'm a mediocre programmer. I won't be forever, granted, but I most certainly am today.

I study and work hard at improving, but that doesn't "put me ahead of most"\--not today, anyway.

<comment><USER33> It does put you ahead in the process of becoming a great programmer, because many have yet to realise this (or that's how I interpreted cjf's comment).

</comment></comment></comment><comment><USER34> You've got me thinking about what it means to be a 'mediocre' programmer.

I'd say there are two types of mediocre programmers. The first writes just ok code. It's structured ok, not great, it's efficient, but nothing special.

The second type writes ok programs. Your basic I/O stuff. The UX is ok, it works, but nothing special.

Now, which would you say you are?

The other of the potential of each of these programmers is, for the person who writes ok code, but the things they make code do are amazing! The code may not be beautiful, but they take on challenges that few others do, and it works.

The second type are the people who make mediocre products, but if you actually look at their code, it is brilliant, beautiful, perfect.

Which are you? Which would you prefer to be?

Of course, their are people who have both and that is the ultimate goal.

</comment><comment><USER35> You can be a mediocre programmer and do great things. You can be a great programmer and not achieve the success relative to your level. It's all completely relative. I'm an ok-to-decent programmer and turned a sizeable profit on $7k worth of time. I'm not putting my kids through college but improved my family's life and I'm content with that.

Learn as much as you can. Build often even if they never see the light of day. You will always improve your skills by being active in it. At some point it will make you better for you. Don't compare yourself to others. Be better than you used to be. You'll be fine.

</comment><comment><USER6> Become a project manager. Everybody is not cut out to be excellent coders, but you probably have heaps more of knowledge than the average joe.

Having a project manager that knows the development process, understand coders and know the basics of programming is so valuable both to us developers and the overall success of a project.

Also, there are a lot of different types of coding and niches. I can't wrap my head around most algorithms, I'll never be nothing but a mediocre C coder. Cryptography makes my head explode... But I know how to craft and architect a web app that scales and lives on without (too much) technical debt.

Turn your weakness into a strength.

</comment><comment><USER36> Develop a sense of curiosity, get into the habit of asking yourself why things are they way they are, even if you don't need to know the answer. Read widely about technology and follow the threads to new topics. Try things just to see how/if they work. Go's a great start - it'll get you thinking about programming language design, concurrency, networking, etc., and all of those will lead to something else.

You'll also need to be comfortable thinking about things you don't understand. If everything you do is familiar to you you're not thinking broadly enough.

</comment><comment><USER37> The fact that you asked the question puts you on the above average developer side. A lot of developers went to school for it because they saw $$$ an wanted a career to make good money. But many of those don't try to do any learning beyond what they took in school, it's just a job to them. If you actually like programming do it in your spare time even though it's also your job and like to learn new things about it then don't worry that you are ahead of or behind others. Just keep learning and asking questions and you will be fine.

</comment><comment><USER38> deliberate practice.

that means continually practicing harder and harder problems. The very things you're not good at.

I think it's easier to explain with an analogy.

What does an Olympic figure skater do that regular skaters don't? The practice the hard moves and when they master one move, they proceed to the next move degree of difficultly.

First they practice a single axel jump.

Once they master a single axel, then they practice a double axel.

Once they master a double axel, then they start working on the triple axel.

Frankly it just takes a lot of mental toughness. To get better you always have to move on to something new that's difficult for you.

</comment><comment><USER39> In my opinion being good comes down having good ideas. You can be genius at your code, but if you have no ideas on how to use that skill to make something awesome, you're still a mediocre programmer. Therefor, if you can learn to think what would be needed or what could be done better and you have the skill to do it, then do it.

Sometimes to get anywhere, or get any recognition is to just build cool stuff, even if they won't bring you any money. Just keep building stuff on great ideas and always have quality in your work.

</comment><comment><USER40> Don't feel obligated to stay at your current job if it doesn't challenge you. The best decision I ever made was leaving a corporate programming job where I was bored 95% of the time.

<comment><USER41> I second this. Moving out of your comfort zone because you have to will make you have to learn new skills.

</comment></comment><comment><USER42> Get a book about compilers. Write a little compiler from scratch. Go around telling everybody about the compiler you wrote. It'll make you feel really smart! Trust me, it works!

</comment><comment><USER43> Hmmm ... I'd say the fact that you're concerned about it means you'll have a long successful career. Ninety-nine percent of software development is the ability to be persistence and unwavering in pursuit of your goal (working software). The other trait that every great developer I've met has is that they're always learning. It's the people that think their education stopped when they graduated from college who won't make it in this field.

</comment><comment><USER44> I used to fear that also, until I made a conscious effort to learn (Pharo) Smalltalk and (Racket Scheme) Lisp. I spent so much time and energy on these two. I practised and practised and practised. And then practised some more. After what seemed like an eternity, I looked at other people's code (Java, C#, PHP) and could instantly identify deficiencies and ways to improve them. So my advice: learn Smalltalk and Lisp, and then practise till your gums bleed.

</comment><comment><USER45> Do or Practice something for 10,000 hours going through in and outs of what you are doing, then comeback and say me that you are a mediocre developer. Sounds good?

</comment><comment><USER46> _Everyday on HN I see some coder come up with an amazing algorithm_

Amazing algorithms don't always make for maintainable code. Most of being a good programmer (like any other job) is about being hard-working, diligent, and thinking about your customers, including the programmers who will have to maintain and extend your code. Anyone can learn to do that - but the most "brilliant" coders sometimes don't.

<comment><USER47> Yes. Brilliance is overrated.

Most of the day-to-day challenges we face require solutions that are well- thought-out, well-designed, and well-implemented. Brilliant algorithms are not a feature in and of themselves; they are only useful if they solve the actual problem at hand. And even when they do, they often need dependable, well- written, "run of the mill" code to support them and flesh them out.

I would rather work with a team of people who are diligent, dependable, and thorough than one or two brilliant aces. And I would rather my software be written by the former as well.

</comment></comment><comment><USER48> Become a manager. A good manager is often a mediocre developer. When your job is simply to make sure people are doing what needs done, and how long something should take, and sort out which of two people have the "more right" solution you don't have to be a great dev, just a person who can keep track of things.

</comment><comment><USER49> Building projects that are interesting to you can be the best way to learn and improve. They allow you to take risks and be bold -- two things almost universally discouraged at 'real jobs'. Finish these projects and take what you learn in the process to make the next one even better.

</comment><comment><USER50> Your are falling for the Survivorship Bias: [http://youarenotsosmart.com/2013/05/23/survivorship- bias/](http://youarenotsosmart.com/2013/05/23/survivorship-bias/) . Keep polishing your skills. Learning Go is a good step.

</comment><comment><USER51> Why don't you just pick something and try to solve it? That will make you read books, online tutorials, maybe a new programming language and that's how you improve yourself. Some coders I know started to learn math just because they wanted to solve something.

</comment><comment><USER52> The good thing is, brilliance doesn't have to do anything with IQ, it just has to do something with hard work.

So try to find a small project that you really, really want to build. Then build it, and see how people use it. That is the most amazing thing as an engineer anyway. :)

</comment><comment><USER53> Everyone is still figuring it out, even the people you look up to. Not just programming or whatever skill you happen to be talking about, everything.

It's OK to doubt yourself, but try to get a better view of your skills, accomplishments and improvement once in a while.

</comment><comment><USER54> i think this brings to mind the good ole "im i talented?" question. trying your hand at many things and still you cant find what flows easily/effortlessly/creatively that you enjoy doing and when you try trying again you fall hard? for me soccer was my bane. love it so much yet, i messed up my shoulder, broke an ankle, fractured a femur trying to do what i like and hopefully get better at. in the end, its up to you to either accept some humans have limitations and some can bore a hole in it and soar high and even some teleport to the other side of limitations. we're all different yet, the same.

</comment><comment><USER55> arvidj, you are hellbanned.

Your comment reposted: The other commentators haven't mentioned the fact that perhaps you could instead try to accept the fact that there is nothing wrong with being mediocre. By definition, most people are. Try to look into why you fear being mediocre? Also, perhaps you just happen to perceive yourself as mediocre? Sometime the want for change is the ill that needs to be addressed, and not the perceived faults in yourself. Good luck however you proceed!

<comment><USER56> I don't think so, their comment shows up fine (for me at least)

</comment></comment><comment><USER57> The only way you can become better is by reading and writing code. If there is something you do not understand dig deeper and learn how it works.

</comment><comment><USER58> How long have you been at it? Any reasonably intelligent person can become a great developer if they work hard.

<comment><AUTHOR> Well I've been coding in one way or another since I was 14 years old, now I'm 22. So that makes it 8 years now.

<comment><USER59> There's a long time ahead of you. Work with smart people and work on your skills regularly. You'll get better before you know it. You'll be surprised to see how much progress you can make by just making incremental improvements regularly.

</comment></comment></comment><comment><USER60> You know what they say, if at first you don't succeed, then middle management might just be for you

</comment><comment><USER61> Output, or "ABC": Always Be Creating (leave Coding to the geniuses, and just build stuff).

</comment><comment><USER62> There is really only one way.

Deliberate practice.

<comment><USER30> This is the thing that nobody ever understands. You absolutely have to practice, in anything.

I'm a high-level pool player, and because of deliberate practice, I went from the worst pool player in town to maybe top 10 in approximately 1.5 years, because I practiced. Everyone else just plays with friends and in matches, never practice.

That gave me a real appreciation for the stark difference in the two approaches.

<comment><USER62> Thank you for this, always inspired by your thread.

</comment></comment></comment><comment><USER63> Simple: find a development project you are truly passionate about, and jump right in.

</comment><comment><USER64> That fear is what will prevent mediocrity...</comment>


Apple Now Has $194B in Cash - <AUTHOR> http://techcrunch.com/2015/04/27/apple-now-has-194-billion-in-cash/#.fewf6c:py0d <comment><USER2> Such an awesomely stunning number. Waiting on a repatriation holiday. I wonder if it affects the currency exchange rates of the countries where it is stashed :-)</comment>


Just watched Chris Mallick's movie/flop "Middle Men" - <AUTHOR> http://www.details.com/culture-trends/critical-eye/201103/chris-mallick-middle-men

<comment><AUTHOR> Actually not that bad, but I think the story of production may be better.</comment>


Show HN: How to Make an AWS S3 Static Website with SSL - <AUTHOR> https://www.josephecombs.com/2018/03/05/how-to-make-an-AWS-S3-static-website-with-ssl <comment><USER2> This works, but it leaves all traffic between the CloudFront edge node and S3 unencrypted. In theory, that shouldn't be an issue, by why risk it?

A better way is to completely leave the "website" bits of S3 off, and leave that all up to CloudFront. You can create an Origin Access Identity, then grant that OAI access to read your S3 bucket (all automated in the wizard when you create a CF dist and specify an S3 origin). You then specify a default object in your CF dist, and bam, CF is using the S3 REST API over SSL to secure that CF-S3 hop.

<comment><USER3> Another important aspect of using AOI is that you don't need to make the s3 bucket public. This matters even if the website is fully public. It has to do with a simple governance rule. No public s3 buckets should be allowed.

That if monitored and enforced would stop many data breaches. With some public bucketd enforcement will be difficult

</comment></comment><comment><USER4> Another way to host a Jekyll website for pennies (and with HTTPS) is [https://www.netlify.com/](https://www.netlify.com/)

<comment><USER5> Go to [https://www.netlify.com/features/#dev- tools](https://www.netlify.com/features/#dev-tools) and check out the dependencies in the image there. I bet an exec said "hey we need a cool looking screenshot of code" and the dev whipped up the most useless package.json they could think of and screen-shotted it. Well, I _hope_ that's the case.

<comment><USER6> I think that's a jokey reference to the left-pad debacle.

</comment></comment></comment><comment><AUTHOR> This is my bill estimate for March - kinda high!

[https://imgur.com/a/kDmdE](https://imgur.com/a/kDmdE)

<comment><USER7> Looks like the majority of your bill -- $4.00/$4.39 -- is in hosted zones. It's $0.50/hosted zone, and you only need one for a single static site. So looks like with reasonable traffic, this jekyll setup is about $0.89/mo for hosting, that's not bad!

</comment></comment><comment><USER8> Highly recommend using CloudFlare instead of Cloudfront.

a) it's totally free, which means once it's cached at CF, no charges from AWS for bandwidth, also no charges for Route 53 since CF handles the DNS too.

b) it can be used to terminate SSL in front of the S3 bucket (with or without the S3 bucket properly using SSL, depending on if you're using path-based or host-based bucket access)

c) cache invalidations are stupid fast

d) any CDN changes are done nearly instant, vs. "however long" Cloudfront takes

$.02

</comment><comment><USER9> What's the benefit of hosting a static website on AWS instead of Github or Gitlab Pages?

<comment><USER10> No HTTPS for custom domains [https://github.com/isaacs/github/issues/156#issuecomment-366...](https://github.com/isaacs/github/issues/156#issuecomment-366542067) is the main one.

<comment><USER11> According to the latest comments and issues linked in that very issue, GitHub Pages has started slowly enabling HTTPS support for sites that have custom domains.

</comment></comment></comment><comment><USER12> [https://zeit.co/now](https://zeit.co/now) is pretty fantastic for this.

</comment><comment><USER13> My question with this kind of setup is: what if a malicious person (or just an unexpected success on HN) gets me a gazillion request, do I end up with a $10k liability ?

I'd rather have the site go down than me go broke, so is it really a good idea ?

<comment><USER14> This is ehy you can create budget limits in AWS. DDOS to your site is not legitimate traffic and AWS will provide you protection against it. Cloudfront is limited by default too. I cant remember the actual req/s but there is a limit. You can also limit access to certain countries where your legitimate users are.

</comment></comment><comment><USER15> My favorite combination for a static website is AWS S3 for content and Cloudflare for caching and SSL termination. I think Cloudflare offers more capabilities as CDN.

</comment><comment><USER16> How do you compare hosting static websites on Hasura (free SSL out of the box) or Heroku vs AWS S3?

I think cloudflare gives more options as a CDN than cloudfront.

</comment><comment><USER17> Where can I read about the costs / month?

<comment><USER18> I've got the same setup at pfortuny.net/reflexiones plus amazon workmail and it costs me around 6$/month. Very low traffic, though. Anyway, the cost is 5$ for the mail, so the blog is negligible.

Amazon's pricing is easy for this simple setup.

</comment></comment><comment><USER19> Probably nitpicking, but why not having www as an alias record as well?

</comment><comment><USER20> Does It work with the free tier?

</comment><comment><AUTHOR> OP here - thanks for all the votes! If you liked this post, check out my latest post here: [https://www.josephecombs.com./2018/03/09/how-I-use-a- compute...](https://www.josephecombs.com./2018/03/09/how-I-use-a-computer- part-1)

<comment><USER21> Some of the votes were fraudulent. That's not ok on HN and not a good way to promote good work.

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

<comment><AUTHOR> can you tell me what votes were fraudulent? And what can I do to prevent it in the future? God bless @dang

<comment><USER22> Ugh, just admit it if you did it, or say nothing. This post I'm responding to comes across badly. I'm sure no unaffiliated-with-you vote fraud bots were swarming to upvote your particular random article, so common sense says there's about a 99.9% chance if there was HN vote fraud, it was the person who stands to gain from the fraud doing it.

I doubt dang is going to walk you through how they detected it either. No need to make people's fraud easier in the future.

Just take your licks and move on.</comment></comment></comment></comment>


How I Work from Anywhere in the World - <AUTHOR> http://wanderling.co/how-i-work-from-anywhere-in-the-world <comment><USER2> My first response upon reading the title: "Answer: I have no dependents." ;)

Enjoyed the article though, Karma was new to me and looks interesting.

<comment><USER3> Definitely helps! Though I do know a fair number of people who do this WITH kids which blows my mind. Glad the Karma tip was useful!

<comment><USER4> I work remote with kids in tow. We have one so far.

<comment><USER5> How old, and how do you manage their education?

<comment><USER4> He's six years old, speaks three languages fluently (putting me to shame!), and is enrolled in school at the moment. Even though I work remote, I do it from a home base, and use that as a jumping off point when we travel during school holidays, summer, etc.

</comment></comment></comment></comment></comment><comment><USER6> "I'm excited to see what Apple has in store at WWDC though. Maybe something even slimmer?"

I'm going to sound like a grumpy old man saying this, and maybe I am. Please, dear god, stop this war on thickness. I want my ports back.

<comment><USER3> Totally agree. I was super excited to upgrade but I'm not sold on the lack of ports + touch bar. Might wait to see what they do with the bitty MacBook. If not, this MBAir and I are together until the death!

<comment><USER7> Luckily for our kind, the refurb market for older Mac laptops should be flush for at least the next 10-15 years.

</comment></comment></comment><comment><USER3> Hey all - I wrote this article. One update: I've since upgraded to a Pixel XL + Google Fi which is a big step up from my Nexus 5.

Happy to answer any questions!

<comment><USER8> Great article, lots of tools I didn't know of. Can you provide more info about where I can get that 2g chip outside the states? Sounds very useful to use a service like that. Also, can you expand a little bit more about the slack integrations? I can't imagine something more than simple notifications for services like github, but you described it as it "changed your life", so I'm assuming you found ways to automate your daily life with integrations.

<comment><USER3> Glad it was helpful! I'm not totally sure where you can get a card similar to the T-Mobile or Google Fi cards outside of the US. I know there are a few "international" sim cards on the market, but I haven't tried any of them myself.

A lot of my Slack integrations these days are powered by Zapier, but for regular dev work + client management, I use simple integrations like Trello, Github, etc. The life-changing part comes from being able to communicate and get updates from the multiple teams I work with in a given day, across multiple companies and groups, in one app that also works on all of my devices.

In my Slack team, I've also set up some private channels where I pipe in things like twitter alerts, flight alerts, etc. so that helps too!

</comment></comment></comment><comment><USER4> I'm currently working remotely from the Philippines.

Essentials for me: Trello, Slack, GitHub, Dropbox, AWS, VirtualBox, Feedly, Pinboard, ExpressVPN, Skype, Adobe Creative Cloud, Toggl, Gusto, Mint

</comment><comment><USER9> Currently in the process of considering a new machine myself and came across a similar article about the MacBook written by Rob Rhyne in 2015 ([http://martiancraft.com/blog/2015/08/macbook-for- developers/](http://martiancraft.com/blog/2015/08/macbook-for-developers/)).

</comment><comment><USER10> Starting out I'd work anywhere in the world. Now only North America & Australia (Sydney/Melbourne is 5 hrs difference from west coast US).

The remote options are better than local except in SF, LA, & Seattle.

<comment><USER11> 4-5 hours total, sure, but it's actually a 17-18 hour difference if you care about weekdays vs weekend!

</comment></comment><comment><USER12> The tooling is easy - but where do you get remote gigs that pay well?

</comment><comment><USER13> > If I could make one improvement to Every Time Zone it would be to have more > time zones available and maybe let you create a set of "favorite" time zones

That's describing one of my favorite sites World Time Buddy [https://www.worldtimebuddy.com/](https://www.worldtimebuddy.com/).

</comment><comment><USER14> Jenn, any tips on finding clients / remote work?

<comment><USER3> That's a whole opus unto itself! In short: easiest way to find clients is through your existing network. Finding remote work...well that depends on what exactly you do, but there's tons of stuff on [http://remoteok.io](http://remoteok.io).

</comment></comment><comment><USER15> I agree with the author that the T-Mobile simple choice plan works as advertised. They only guarantee 2G but I have almost never seen that. The slowest has been 3G and in my places in the EU are LTE speeds.

<comment><USER3> They had a 4G promotion in Europe over the summer which was FANTASTIC. I didn't realize how slow 2G felt until I had 4G back. Another reason I switched to Google Fi.

</comment></comment><comment><USER16> For the coding-oriented traveling workers, this is one very useful tool: [https://codeanywhere.com/](https://codeanywhere.com/)

</comment><comment><USER17> Has anyone managed to pull off remote work while in a corp job?

<comment><USER18> I'm doing that right now. A lot of restrictions.

<comment><USER17> I've been looking into traveling & working remotely, as I've transitioned into a mobile role...just need internet + phone to get work done, but now looking into logistics/feasibility of sustaining the remote work-life balance. What sort of restrictions have you ran into?

<comment><USER18> First, I am not a lawyer, so take this with a grain of salt.

What part of the world do you live in/claim residency in? The reason I ask, is because I live in the US. If you're in the US or EU schengen zone, you can live and work almost anywhere in that particular area with no legal restrictions. For instance, my mailing address is in California, but I can easily move to Florida or Nevada or some state without a state income tax. Check your company's HR policy, I know there are a few states I'm not able to work from due to my company's policies.

If you work in a foreign country, that's a whole new can of worms. My company doesn't have a problem with you taking a month off and working a few weeks in India, for example, since it doesn't really make sense to fly to India for just 2 weeks due to travel times and jet lag, and you don't want to blow all your vacation at once.

However, if you're thinking of living for half a year in Ecuador, for example, even if the time zones line up, the company probably won't be as cool about it _if_ they know about it, in my case.

The reason is that you're kinda breaking your tourist visa. You're not supposed to be doing any work, and if you are, you're supposed to be paying taxes to the country you're living in.

Now, it's a ridiculous argument, as you're pretty much living as a tourist, not taking a job from a local, and putting money in the local economy. However, if that's how your tourist visa is written, that's how it's going to be.

Now, if you're working for yourself as a freelancer, they probably won't go after you too hard, mainly because the upside is so limited. You can only squeeze so much blood from a stone, and they'll probably spend more money prosecuting you/doing audits than you'll pay back taxes.

However, since you and I (appear) to be working for large corporations, they have much more of an incentive to sue you. They can tack on penalties, and threaten a huge accounting/legal team to "discover other irregularities" in the company's HR policies in hopes of a large settlement. If that's the case, you gotta keep the fact that you're spending longer periods of time overseas to yourself.

</comment></comment></comment></comment><comment><USER19> Great article! Thanks for sharing</comment>


Impersonation of an airline employee [In Bulgarian] - <AUTHOR> http://m.dnevnik.bg/temi/izmamata_aleksandur_nikolov <comment><AUTHOR> A crook created an online persona, pretending to be working in the airline industry. He used public photos from an Air France employee on a LinkedIn profile.

The crook had created the persona from 2012. It was a scam to obtain credit card numbers by selling airline tickets.</comment>


Drowning in a C of Interviews - <AUTHOR> http://blog.bitquabit.com/2011/04/13/drowning-in-a-c-of-interviews/

<comment><USER2> I really did like getting interviewed in C. :) But I was also confident using it.

It was appealing knowing that interviews were conducted in a language that wasn't really being used. Lots of companies claim they will hire smart people regardless of skills, but then you show up to interview and the guy across the table really expects you to know python and is flabbergasted that you bothered applying without it. I felt Fog Creek really demonstrated commitment to the principle by interviewing in a "useless" language. As someone with a bit of experience looking to make a change, it was a nice touch.

<comment><USER3> You're pretty deluded if you think that C is a "useless" language.

<comment><USER2> It more or less is at Fog Creek. I am not unfamiliar with the usage of C outside of Fog Creek.

<comment><USER4> They have their own compiler for a custom VBScript derivative. If there's no C anywhere in it, I'd be surprised, but I am operating without knowledge of its implementation or output.

Edit: So what did I do wrong here? I admitted that I'm shooting in the dark, admitted that I'd be surprised if my hypothesis was true, and had absolutely no knowledge of who the person I'm replying to is. It's certainly not on his profile.

I put forth an incorrect assertion, a couple comments corrected me and I was happy to learn this insight, but my comment is already -1 because I'm what, not contributing to the conversation? Or because I was wrong? Do you _have_ to vote on everything?

It's really interesting to me that HN whines daily about the decline in comment quality, then turns around and grays this comment. Decline of HN, indeed, downvote everyone unless they're correct or a valued member of the community. After yesterday's observations I figured I'd give it one last go, but now I just hope this community dies the hypocritical death it deserves.

<comment><USER5> Ted worked at fog creek until very recently. He's also an OpenBSD contribiuter. I'm inclined to agree with his opinions regarding the relative value of C at fog creek.

I did an internship there but didnt ever look directly at wasabi. I know that it's not really in active development (only FogBugz even uses it) though so even if K&R hacked it up themselves, I'd argue it's not really important there anymore.

</comment></comment></comment></comment></comment><comment><USER6> It's a bit hard for me to believe that there are programmers, who dont understand Pointers!

Though I am still in school, I feel everyone should understand how Memory works.

My assumption is that everyone should at least know about:

1\. Pointers and their physical meaning

2\. Difference between Process specific virtual memory and physical memory

3\. Difference between Static, Stack and Heap Memory.

4\. Also it is important to understand what happens when a disk access is required, and difference between Random reads and Sequential reads.

5\. Bonus if you can understand, how swapfs is utilized and L2,L3 cache work.

<comment><USER7> I believe there is a difference between knowing how memory and pointers work and being proficient at pointer manipulation in C.

If you enforce such kind of interviews in C, you will miss lots of great FP programmers. Maybe you don't care anyway.

<comment><USER8> I would bet that people who are good at working with pointers in C are drastically over-represented among great functional programmers, so you won't actually lose that many.

</comment></comment></comment><comment><USER9> This blog post seems to have the feel of someone interpreting scripture. Only in this case, the author of the scripture is also the one he's presumably challenging with his interpretation. I assume Joel is ultimately responsible for the existing FC approach to interviewing... (?)

</comment><comment><USER4> This isn't a C-specific problem; of course people are going to be more relaxed in their comfort zone. If you asked me to write a Web server in Python, I'd be a lot more relaxed about it than if you asked me to do the same in Forth. There's a reason nothing changed when he dropped C (what goes unsaid: is he putting C in the job description?).

Joel's observation about pointers is dead-on, but I've personally beat that horse on HN in the past and will spare everyone a greatest hits anthology.

</comment><comment><USER10> Hmmmm. Given a language X that is not used in actual development in an organization, at what point does interviewing with whiteboard coding in X become just another credential?

I like (FTA): "So I've picked a question that forces candidates to design a data structure" . . . "I'll continue conducting my interviews in the language of the candidate's choice"

As an even more general question to hackers here, what would impress you more? A candidate who comes in, whiteboards out an algorithm and data structure in C to solve a problem, or a candidate solves the same problem in Clojure?

Particularly if your org uses neither of those two languages :-) Of course, you have to grok the different paradigms you might use in both languages or you'll probably be unable to make a decent judgment.

<comment><USER2> My tactic interviewing people for a sysadmin position was to allow them to use any language they knew. For the most part it went well. Even someone who doesn't know a thing about programming can generally pick up how the interview is going from the candidate's reactions. But occasionally someone would quite confidently assert some code would do something I didn't think it did, but I didn't really have the powershell chops to call them on it. For a sysadmin position, there was no one language we could standardize on, and the interview was designed more to test ability to use one's tools, not to program, so it was the best we could do. We weren't going to make every candidate learn perl/python/ruby just to apply.

A dev candidate who solves a problem in clojure may be impressive, but since I'm less qualified to judge, I will be less confident hiring them. Your best chance to get hired is to convince me that you are better than everyone else, and the best way to do that is to do something impressive that I can compare to everyone else.

I've also had people go from passing to failing because they overreached. More than one candidate successfully produced a correct C solution and then sunk their own battleship by volunteering a completely wrong soliloquy on heap vs stack memory. "Noone knows you're stupid until you open your mouth." Do NOT use clojure if you're betting the interviewer won't catch your mistakes.

</comment></comment><comment><USER11> I interviewed at Fog Creek recently (and I don't think it was with Ben, the post's author), and I actually didn't code in C. I answered my questions in Python, just because I'm more comfortable with it these days. So I don't know if this is a new thing they are trying out, or if internship interviews are different.

(I believe I'm allowed to say this about the interview. If Joel or someone at Fog Creek comes across this and takes issue, just let me know and I'll remove the post.)

<comment><USER12> If you interviewed in Python for a dev position, then you interviewed with me or one other coworker who is also trying this experiment. The majority of Creekers still do their interviews in C, and are in fact passionate about it: [http://thoughts.rockhymas.com/post/4580899270/in-which-i- def...](http://thoughts.rockhymas.com/post/4580899270/in-which-i-defend-the-c- standard)

</comment></comment><comment><USER13> Really depends on your situation, but do your interviews in pseudo code. Evaluate their ability to translate your requirements into a logical set of events that will satisfy your requirements.</comment>


Malloc Challenge - <AUTHOR> http://vicsydev.blogspot.com/2016/11/the-malloc-challenge.html <comment><USER2> >[libc4life] is aiming for simplicity and leverage; and it makes a real effort to get there by playing on C's strengths, rather than just inventing yet another buggy Lisp.

Ouch, right in the feels, I've been working on [https://buildyourownlisp.com](https://buildyourownlisp.com) in my spare time. (EDIT: I was looking for a name for the repo, YABLisp it is.)

> coding in C is a welcome therapy after seemingly wasting years exploring > various ways of pretending the hidden complexity in my stack was someone > else's problem

I've noticed several older talented programmers express similar feelings. I was watching Casey Muratori's Handmade Hero stream, where he writes a game in C from scratch, and he said, I don't know who would watch this except aging C programmers.

I'm less than 30 but I already feel like an aging C programmer. Most OOP seems like a morass; I've switched to writing my own projects in C and my prototypes in C-like Python. But I wonder what hope there is for people like us in the industry, which seems to be moving ever further away from this type of programming.

<comment><USER3> _But I wonder what hope there is for people like us in the industry, which seems to be moving ever further away from this type of programming._

C is still very popular (along with Asm) in embedded systems. ARM cores and large memories are certainly getting very cheap, but still not at the level of many of the 8 and 16-bit microcontrollers.

I find OOP often overused too, but it can be genuinely useful in certain situations where there is a very strong association between some data and the operations on it. For this reason, I tend to use a subset of C++ in a style that would probably enrage a lot of the "C++ is not C" advocates.

<comment><USER4> I've noticed this, and also that the typical salaries for embedded systems developers seems to be lower than for hotness.js developers :(

Am I wrong? Hope so.

<comment><USER5> My experience, coming as somebody who has experience on the large end of embedded (100's of MHz, 100's of MB RAM, MMU, running Linux), albeit a while ago, is that it's hard to break back into it if you've been out of the community for a while.

The last time I was looking for a job, I had been doing non-embedded, including kernel and low-level for 8 years or so, and I had the darnedest time finding embedded positions to apply for, let alone get calls back from.

Startups that do embedded seem to mostly get the embedded done in the MVP stage, and by the time they're looking to grow, they've got a (small) team already doing that work.

In fairness, this is partially self-inflicted; iRobot has been on the monthly whoishiring threads for as long as I've been looking for jobs in the Boston area, but I decided long ago that I'd never work in defense (or finance).

Recently, I've added to that list "companies whose business model is selling their users' information" (many of them these days), and "companies whose entire sales pitch plays on your fears" (a recruiter tried to put me in touch with a company that does baby monitors that measure some basic health parameters, and their promotional video was appalling to me).

I kind of stuck a toe across the first line, and tried talking to somebody Fitbit-esque, but never got a call back. I also wound up with a connection into an electronic paper company, but that went cold after submitting a resume. Ditto a company that does automotive suspension stuff.

I realize that being out of the community for a while makes it hard to get consideration if there are other candidates who have current experience, so I started a personal project building a clock out of VFD tubes, and added a github link to my resume before submitting several of those. That didn't seem to help.

I got hired doing non-embedded before I finished the clock project. I'm at the point of needing to learn EAGLE, lay out boards and get them made. That was a year and a bit ago; right now I've got other projects that take up my weekend time.

To respond directly to your point, I'm willing to bet that there are two factors at work: 1\. Supply and demand. If demand exceeded supply, I would think that I'd at least be able to get a call back with my background. 2\. Hardware is a hard row to hoe. There's a lot less capital invested in a hotness.js project that flops, and it's a lot easier to scale if it takes off. No, it's not necessarily _easy_ , but there's a wide gap between "provision more instances on EC2 and fix the bottlenecks in the architectures" and "the factory is already at capacity and the supplier for the key part is backordered for 3 months". The money that doesn't need to go to covering those risks can go into your pockets.

<comment><USER6> I'm doing embedded contracting between startups. Its been pretty easy to find work, but I've been doing this sort of thing for decades. In fact, 4 days after quitting the last startup (new investor changed direction) I got a panicky call from an old contract begging me to pick up a project. It had been 10 years; they found my number in an old rolodex.

Embedded now has plenty of that 'large end' work now, since SOC/SOM prices have come way down.

As for iRobot, I actually called them. They split in half; their whoishiring entry is the Roomba people not the military people. But they're strangely still putting 5 tiny controllers in each vacuum instead of one hefty processor. And they're an east-coast Boston company, quite a bit different from a west-coast startup.

Re: Eagle. My college roommate wrote a board-layout package with some friends called Eagle years ago. He's from Austria. I wonder if its any relation to the modern product?

</comment></comment></comment></comment></comment><comment><USER3> Before I read the article or the comments I thought it would be about rewriting code to _not_ use dynamic allocation, which is IMHO a far more interesting (and challenging to some) exercise. Contrary to common expectations, it often doesn't mean e.g. restricting the lengths of inputs, and can result in simpler, more efficient, and less buggy code. From my experience it is usually those with a background in higher-level languages who overuse malloc().

<comment><AUTHOR> You should have a look at the repository README. libc4life bends over backwards to provide stack allocation and value semantics wherever possible. Right now I'm working on an ordered map that allows user defined key/value sizes which lets it allocate all the memory it needs in one block and provide value semantics.

</comment></comment><comment><USER7> See also:

\- [http://locklessinc.com/benchmarks_allocator.shtml](http://locklessinc.com/benchmarks_allocator.shtml) ($, use as a minimum performance target)

\- [http://www.nedprod.com/programs/portable/nedmalloc/](http://www.nedprod.com/programs/portable/nedmalloc/)

\- [http://phk.freebsd.dk/pubs/malloc.pdf](http://phk.freebsd.dk/pubs/malloc.pdf) [PDF] (phkmalloc)

\- [https://github.com/gperftools/gperftools](https://github.com/gperftools/gperftools) (tcmalloc)

\- [https://github.com/ivmai/bdwgc/blob/master/malloc.c](https://github.com/ivmai/bdwgc/blob/master/malloc.c)

\- [https://github.com/jemalloc/jemalloc](https://github.com/jemalloc/jemalloc)

\- [http://gee.cs.oswego.edu/dl/html/malloc.html](http://gee.cs.oswego.edu/dl/html/malloc.html) (dlmalloc)

<comment><AUTHOR> Thank you, but that's not the problem I'm solving. Any one of those could be used to feed any implementation from the challenge. The idea I'm pushing is using local knowledge to customize memory management, instead of trying to find the perfect one-size-fits-all solution.

<comment><USER8> Aha, I see.. Very nice. Like the following implementation of free() as commonly used in HFT:

void free(void *mem) {}

<comment><AUTHOR> That's a totally valid solution to some problems :) Having access to a decent allocator protocol lets you do that and more.

</comment></comment></comment></comment><comment><USER9> I recall reading in the last year or two a recount of how a game developer got their PS3 engine to run at 30 or 60Hz framerate by aggressive triple-buffering of their scenes.

One of the interesting bits about the article was their memory allocation scheme. Each game frame they'd allocate a single huge memory pool and then allocate from it by simply incrementing a pointer into the pool. I think this is what you describe as a slab allocator, because they never free()'d their allocations, they just recycled the pool after each frame had been rendered.

I kindof see slab allocator as a happy middle ground between allocating temporary memory from the stack and full-blown free-list allocator (or whatever your classic malloc implementation is.)

Are there any high level languages that have the ability to provision fast memory allocation pools like a slab where garbage collection occurs when the slab is no longer accessible, for instance?

<comment><USER10> You are describing an arena allocator. Slab is more like a set of free lists per object size.

<comment><USER11> IME arena doesn't really have a fixed definition. The term can and has been used to refer to something like an object stack or bump allocator, but also to something that supports deallocation and reallocation. The term goes back over 30 years and nothing specific has really stuck.

I think the most you can say of an arena is that it's usually a contiguous region of memory from which smaller allocations are made, and which can be efficiently freed as a whole. An arena may only support fixed-size allocations, or a range of sizes; it may or may not support deallocation. However, in many cases it's natural to require multiple regions to satisfy all allocation requests for a particular context (task, generation, etc), so don't be surprised if an implementation labels a collection of contiguous regions an "arena".

The term pool is similarly ambiguous, but usually implies support for deallocation and recycling of memory. It does not necessarily imply a contiguous region, but that's a natural optimization in a language like C.

Slab is less ambiguous because it has a very specific origin in SunOS-- allocation and deallocation of fixed-size, often typed objects (to optimize initialization).

<comment><AUTHOR> They're all out there floating around :) What I refer to as a pool allocator is a set of separate allocations, could be same size. While a slab is a single block of memory that's dished out as separate pointers, that could likewise be same size.

</comment></comment></comment></comment><comment><USER12> All past 15-213 students go in search of their malloc lab solution.

<comment><USER13> Current 15-213 student here in the middle of malloc lab, my current solution is probably worse than anything in that link (left unclicked).

<comment><AUTHOR> Give it a spin, you might learn something. Your class is probably focusing on general purpose, system level allocators; a much thornier problem without any really good answers. As How to Solve It states; if you can't solve the given problem, try to solve a simpler version of the problem.

</comment></comment></comment><comment><USER14> Awesome challenge.

Back when I worked in a C/C++ shop we'd use this as an in-person interview question for senior positions. The candidate was never expected to finish but more as a springboard to talk about the pro/cons and issues they'd seen with performance/etc of various approaches.

<comment><AUTHOR> Good call, writing C/C++ without having a grip on memory allocation is a recipe for exactly the kind of disaster we're in right now :)

<comment><USER15> Depends on the domain - i suspect that this question would cut off qualified application programmers who are not perfectly familiar with lower level/infrastructure code.

<comment><AUTHOR> Not if they're writing C/C++; it doesn't really matter how hard you try to hide memory management when the whole language is designed around memory and pointers. What kind of programmer is that, anyway? Who can only program specific api's, as long as they don't touch the wrong parts of the language.

<comment><USER15> There are different strategies for handling perf problems of memory allocation - you can cache blocks of the same size in some linked list within the application (free list) or you can reconsider the allocator/allocation strategy. Both get the job done.

Preferance of the first solution does not make you a worse programmer.

<comment><AUTHOR> What you're describing is essentially a pool, which could be thought of as a kind of allocator since it provides an allocation strategy. There's even one in the challenge that does just that. Nothing makes you a worse programmer except refusing to learn.

</comment></comment></comment></comment></comment></comment><comment><USER16> How about: mmap() a few terabytes of virtual space let malloc() be pointer addition and let free() be a no-op?

<comment><USER17> Somebody out there is doing this in production. I guarantee it.

<comment><AUTHOR> Why wouldn't they? If it turns out to be a good solution for the problem they're trying to solve? There's nothing wrong with coming up with your own solutions, that's why we got brains instead of answering machines.

<comment><USER18> It is a problem if it's not properly documented. This system will probably outlast their time at that company, so the next poor shmuck is left to figure out what that program is doing.

<comment><AUTHOR> Agreed, but that's an if; there's no reason to assume anything. And the next scmuck also doesn't need to spend most his time struggling to find a combination of dependencies that still kind of work. There are advantages to owning your code.

</comment></comment></comment></comment></comment><comment><USER19> Let's all just agree to use Perl. It's just dynamic, functional, OOPy C isn't it?

J/K. I think this is an interesting problem in that its a sandbox for allocation and GC in pretty much any dynamic interpreter's implementation. My qualm is that it would be "easy" to tune for the test. Consider the difference between dynamic blocks of a small but fixed size, getting alloc'd/freed in an asynchronous way (a network stack?) versus a pool of variable byte length strings getting shuffled around (a key/value store?). Those are simple, but drastically different, strategies for your heap. There won't be a "best" answer besides the limits of your problem domain.

<comment><AUTHOR> Been there, done that. Even went to YAPC EU in Pisa and had a whiff of Larry. Not for me, that's all I can say. It's too loose, too much shooting from the hip. There's a lot of good ideas in there though.

Agreed. Which is why the 'one size fits all' approach might not be the best way to go. The main reason I decided to launch the challenge, and encourage a more combinatory approach with local special purpose allocators.

</comment></comment><comment><USER20> A malloc benchmark that doesn't measure multithreaded performance is worse than useless.

<comment><AUTHOR> Only if you insist on clinging to a general purpose, system level perspective on memory allocation. No amount of thinking and reasoning about these issues is useless.

<comment><USER21> While OP might've phrased it more politely, he's got a point - allocators that aren't designed for multithreaded use are ultimately oversimplified toy projects.

It's really not that much of a challenge to knock together a (slab + heap + free list) allocator that will perform really well single-threadedly. However it will be nearly impossible to adapt it to the multithreaded context. It is a considerably more complex task and the end result _will_ end up looking like a rocket ship compared to a simpleton that even the best single-threaded allocator will look like.

<comment><AUTHOR> Not if they're meant for specific uses in limited parts of your application; one allocator per thread, for instance. Why are you clinging so hard to the system level, general purpose perspective? Given that the problems it comes with don't really have any good answers. How is that supposed to lead us forward?

</comment></comment></comment></comment><comment><USER22> at UIUC, there's a project in the systems class (CS241) that is exactly this. there's a leaderboard with projects and how it compares to the system malloc for a variety of metrics

this is definitely one of the best projects i ever did in school and a great coming of age project. worst case, there's always an implementation at the back of K&R ;)

<comment><USER23> I agree. That assignment was one of my favorites. It was a lot of fun because it was fairly easy to get something that functioned, and as you came up with ideas for making it better (or just got ideas from reference implementations), you could watch your metrics get better or worse.

<comment><AUTHOR> Exactly the experience I'm trying to provide with the challenge. For the price of forking the repository you get a framework for trying out and comparing your own allocation strategies.

</comment></comment></comment><comment><USER24> What's the incentive? Credits? Give me a break.

It's fairly easy to beat the given examples but in the end heap management is heavily dependent on application, client code, platform, hardware and many other criteria. It's a very complex problem space and what matters here is how existing important code behaves and continues to behave given that existing code has most likely made assumptions how the heap is managed.

glibc is a good example of a perfectly fine compromise not optimized for any particular use case. Anyone who has had performance issues with it has most likely already implemented their own solution for their problem set.

It might much more worthwhile to develop a set of malloc like implementations a developer can chose from instead of going for a fits all approach.

<comment><AUTHOR> Further, the complexity and need for flexibility is exactly the problems that I'm trying to deal with here. That's why the challenge encourages splitting the allocator up in Unix-like pieces and stacking them to get the desired features.

</comment></comment><comment><USER25> What if I want to write a malloc that requires the size to be stored separately? (i.e. one that needs to be paired with free(ptr, length) rather than just free(ptr) for good performance.) Wouldn't that provide more flexibility in the challenge and be more useful (e.g. for C++'s std::allocator)?

<comment><AUTHOR> The pool reference allocator does just that internally. It prefixes each allocation with a block containing the size among other things. Either base your implementation on top of that or take the idea and run with it.

<comment><USER25> You totally missed the point of my question. I was __NOT __asking "I have an allocator that doesn't store the buffer size; how can I use it?"

I was asking, "I don't think an allocator should need to store the buffer size internally; why not formulate the challenge so that the block size doesn't need to be stored?"

<comment><USER26> I would not do that. Userspace Apps have way to many ways to screw up memory managment already. Allowing them to

        buf=malloc(128);
        free(buf, 256);

seems dangerous, if free can't check the size.

But kernels sometimes do just that ( free(ptr, size) ), for performance reasons and because "kernel writers know what they are doing".

</comment></comment></comment></comment><comment><USER27> I'm trying to build it in MacOS but I'm inundated with errors. For example malloc_perf.c:39:3: error: implicit declaration of function 'clock_gettime' is invalid in C99 [-Werror,-Wimplicit-function-declaration] BENCHMARK("basic", &c4malloc); ^

<comment> david-given Looking at the implementation of libc4life, I think it's full of gcc-isms. C4DEFER() is this:

        #define _C4DEFER(code, _def)				\
          void _def() code;					\
          bool _def_trigger __attribute__((cleanup(_def)))	\

        #define C4DEFER(code)				\
          _C4DEFER(code, C4GSYM(def))			\

So, nested functions and gcc attributes.

Nested functions awesome, but they're a gcc extension, and only supported on some architectures anyway, and AFAIK only work if you have an executable stack, which is frowned on these days (because they have to create a callable thunk to stash the nested function's context pointer).

[http://stackoverflow.com/questions/8179521/implementation- of...](http://stackoverflow.com/questions/8179521/implementation-of-nested- functions)

My understanding is that clang doesn't support nested functions, but it does have its _own_ non-standard extension, blocks. But of course that's still not standard C.

I'm currently writing clunky C89 code for an old compiler (and occasionally, K&R C!), and I got really excited by this library for a moment, but... nope. Non-standard. Can't use it.

<comment><AUTHOR> I had to draw a line somewhere, and C99 with GNU extensions is where it is. Cleanup attributes and anonymous functions are just too useful to leave behind. And since I'm using clang to develop this, I'm pretty sure it supports nested functions just fine.

<comment> david-given Hm. Sounds like they added them --- nested functions certainly weren't supported the last time I looked (because, as you say, they're far too useful, and I hated having to give them up).

Have you had any reports about problems on, e.g., OpenBSD, related to needing an executable stack?

<comment><AUTHOR> Could be, it's moving fast. Once I realized I could use nested functions to provide anonymous functions and deferred actions with decent syntax in a semi- standardized way, I was hooked :)

Nothing, but I seldom hang around in the BSD crowd these days.

</comment></comment></comment></comment></comment><comment><USER28> its an interesting exercise for learning but the code style is awful.

freel instead of freelist? ffs.

abbreviating memory to mem is enough of a mistake in the standard library without going further to m like malloc does and some of the examples here.

still, much respect, to the coder4life for making such a good effort and having such an awesome name...

<comment><USER29> Coding style never saved anyone's C code from being insecure. So it's not something to be concerned about, C code is generally awful on its own.

<comment><AUTHOR> What's awful with C on it's own? You can write all sorts of code in C.

</comment></comment></comment><comment><USER30> Looks like fun. Wish I had time to join in :(

<comment><AUTHOR> Oh come on, there's always time for fun :)

</comment></comment><comment><USER31> GitHub apparently infests every code snippet in existence. People work for free and GitHub gets the credit/branding.

<comment><AUTHOR> Too be fair, they're also providing a decent service for free.</comment></comment>


Promise of No Child Left Behind falls short after 10 years - <AUTHOR> http://www.usatoday.com/news/education/story/2012-01-07/no-child-left-behind-anniversary/52430722/1

<comment><AUTHOR> The Education Next blog includes some thoughtful responses to the tenth anniversary of the No Child Left Behind Act (NCLB).

[http://educationnext.org/five-thoughts-about-nclb-on-its- ten...](http://educationnext.org/five-thoughts-about-nclb-on-its-tenth- anniversary/)

Like the blog author, Michael Petrilli, who notes that the trade-offs build into the law were real from the beginning, "Personally, I'd prefer a policy that aims for more balance: achievement gains across the performance spectrum, not just at the bottom; and a more holistic view of what it means for students to be well educated. Literacy and numeracy are (obviously) not enough."

AFTER EDIT: Other comments here write about the funding level for some of the federal government inducements to school change at the state level that were built into the No Child Left Behind Act. To be sure, the act never promised that the federal government would pick up the full tab to fund the state school system of any state, or anything near that. The United States federal government devotes substantial resources to K-12 education through various programs, but the main funding of primary and secondary schooling in the United States has always come from local and state governments.

<http://www2.ed.gov/about/overview/fed/10facts/index.html>

(A FAQ prepared by the previous administration)

<http://www2.ed.gov/about/overview/fed/role.html>

(A FAQ prepared by the current administration)

<http://nces.ed.gov/fastfacts/display.asp?id=66>

(Current National Center for Education Statistics page on spending for public elementary and secondary schools)

If states are in earnest about raising student achievement, they could of course target the larger amounts of money they spend on activities that are best evidenced as activities that raise student achievement. To do that, of course, the states would have to have some kind of reliable data on what activities of their school systems best raise achievement, which is part of what NCLB was about.

</comment><comment><USER2> A related documentary, "Waiting for Superman", is available on Netflix Watch Instantly.

I found it very well produced and informative, if not a little bias (nature of the medium) and a bit disheartening.

</comment><comment><USER3> The problem with No Child Left Behind wasn't the testing. It's that it was an unfunded mandate. The Federal Government was requiring the states to do something, but at the same time not providing the resources to do it with. Given that, can we really be surprised that NCLB was a failure?

This criticism, by the way, isn't new. Opponents of NCLB were (correctly) bringing up the "unfunded mandate" charge when the bill was still in consideration.

<comment><USER4> Yes, it was underfunded (not 'unfunded' - it's just that there weren't additional funds injected for it), but that still doesn't make the testing part a good idea. What you end up, even if the resources are there, are pupils who pass tests, not necessarily pupils who are fit for a job or even for life. Pupils who pass tests are not necessarily what you want to boost your economy.

<comment><USER5> There are bad tests.

However, we have a problem. Most of us would like kids to get as much education as possible given the money we spend. Very few of us are willing to spend money on "education" that doesn't actually educate kids.

So, how do you propose we figure out how to spend money on education?

If your answer is "spend more", my question is "how do I know what I'm getting for said money?"

</comment></comment></comment><comment><USER6> OK, so NCLB wasn't a perfect-from-the-start solution. Few initiatives of that scale ever are. Time for a pivot, not for going back to the bad old days.

<comment><USER7> But a return to the "bad old days" is exactly what the education establishment wants. I think the reporter here buried the lede. This was the most interesting paragraph for me:

 _"People were stunned because they were always led to believe that things were going fine in this particular school. And the fact of the matter was, for huge numbers of students that was not the case," Miller said. "That led to a lot of anger, disappointment. That led to embarrassment. In many instances, the schools were being held out as exceeding in their mission, when it fact they were failing many, many of the children in those schools."_

Test scores are hard to argue with so they repeat this "teaching to the test is bad" mantra endlessly. Of course, when they start talking about other countries school systems as being better what's the first metric they cite? Test scores. I have yet to here an alternative way of measuring performance that didn't amount to "trust us".

</comment></comment><comment><USER8> Massive federal program falls short of goals. Astonishing.

</comment><comment><USER9> NCLB was designed to fail from the get-go.</comment>


Map-Reduce in JavaScript, working on client Browsers - <AUTHOR> http://blog.0x82.com/2010/11/22/map-crowd-reduce

<comment><USER2> This kind of ties into a proof of concept I worked on a while ago.

An advantage of the native SETI-at-home clients is that they have access to the gpu. But theoretically so does javascript via WebGL so I took a stab at implementing matrix multiplication entirely on the GPU from within the browser. I think it could be a pretty powerful idea if it were fleshed out a bit more.

<http://learningwebgl.com/blog/?p=1828>

</comment><comment><USER3> There was something similar to this posted a few months ago, <http://maprejuice.com/>. I believe it also used node.js and web workers in order to do distributed map reduce operations.

<comment><USER4> Yeah, myself and two others built the same thing for Node Knockout (maprejuice). In my opinion it's hardly an original concept at this point, but still a very interesting one with an interesting problem set.

</comment></comment><comment><USER5> I wonder what kinds of workloads this is actually useful for?

JavaScript performance has vastly improved in the last few years but it's still relatively slow, as are most individual's network connections.

IIRC a bunch of people tried this approach on the Engine Yard SHA-1 hashing contest, and were obliterated by those using CUDA, etc.

<comment><USER6> I suppose its usefulness is closely related to the number of clients you could use it with. Would it be useful on a mom & pop's website? Doubtful.

Something with a measurable fraction of Facebook's scale might be able to get something useful out of it... assuming the users don't revolt when they discover it.

</comment></comment><comment><USER7> Similar to this? [http://www.igvita.com/2009/03/03/collaborative-map-reduce- in...](http://www.igvita.com/2009/03/03/collaborative-map-reduce-in-the- browser/)

</comment><comment><USER8> Don't have time to verify this until the weekend, but if it works as advertised, this is brilliant.

</comment><comment><USER9> Very cool proof of concept. The advances in web-front technologies are all so very exciting.

</comment><comment><USER10> If you want to do some actual high-performance work, I'd look at Java applets. Java runs around 5x faster than the same JS code (V8), and much much faster in browsers like IE. Plus they have real multi-threading.</comment>


Why are streets so dirty near the HQ of Y Combinator SF? - <AUTHOR> https://firstname.lastname@example.com,-122.4084049,3a,56.6y,265.17h,84.35t/data=!3m6!1e1!3m4!1s1ku0w7U6vcS-c98rvj9RLQ!2e0!7i16384!8i8192!4m5!3m4!1s0x80858084197e9ff9:0xa9218d61ca39a0b0!8m2!3d37.7815201!4d-122.4076003 <comment><USER2> That's pretty normal looking. The street isn't actually dirty, but it is cracked and worn; it needs to be resurfaced and painted. A power washer would do a lot of good for the sidewalks though, and they probably haven't scrapped up the gum in a few years.

</comment><comment><USER3> Welcome to SF!</comment>


Police refuse to rule out theory that it never existed - <AUTHOR> https://www.telegraph.co.uk/news/2018/12/23/police-admit-may-never-have-gatwick-drone/ <comment><USER2> Title should be:

"Police defend Gatwick drone investigation as they refuse to rule out theory that it never existed"

<comment><USER3> Submission titles on HN are limited to 80 characters.</comment></comment>


Code Review + Google Wave = Code Wave - <AUTHOR> http://helderribeiro.net/?p=130

<comment><USER2> It's dizzying thinking about all the existing things that Wave could replace, let alone the novel things that could be built on it.

Out of the box, it's email, instant messaging, a blog engine, a wiki and Twitter. With an extension or two, it becomes any kind of social tool you can imagine.

It sounds too good to be true, but that's because we've been obsessed with the web for so long that we've become blind to just how backwards it is for the things we want to do. If we want to build social tools, _of course_ we should start with a social platform and build little tools on top of it.

</comment><comment><USER3> The git or mercurial teams should build a Google Wave robot that comes with the software. Not because I want them to, but because its a killer feature. :)

Also for syntax highlighting - take a look at codemirror. I've used it before and have been very satisfied with its performance and functionality.

I had a similar idea, but create the whole IDE on wave. Several advantages:

1) Programmable - you can add in functionality to the IDE much more easily by adding gadgets or even robots.

2) It gets rid of the concept of 'local copy' altogether, and makes your development project accessible from anywhere by anyone. It also means that you only have to set up one test environment rather than everyone's local environment.

3) You can have as many test servers or production servers as you want. One robot to manage multiple servers at once. This robot is essentially a remote command line connected to serveral test/production servers. This makes cheap servers (100$ wall servers anyone?) useful.

</comment><comment><USER4> you have something very real and mature here.</comment>


Stackoverflow is down - <AUTHOR> Stackoverflow is down <comment><USER2> It's back. Was briefly showing the default IIS page.</comment>


Show HN: Material Design for Bootstrap (Free UI KIT) - <AUTHOR> http://www.mdbootstrap.com <comment></comment>


Ask HN: Best way to equalize founder stakes 2.5 years in? - <AUTHOR> Hey HN - a friend and I started a company 2.5 years ago. We started 60/40 originally, but have since worked our way to a 50/50 (we agreed a while ago this was a better arrangement for motivation etc, and has worked well) and need our share structure to reflect that. Wanted to see if anyone has been in this situation before and how to minimize tax burden
Some relevant details:
- C corp with 10m shares outstanding, 5m common stock issued - 3m to 1 founder, 2m to the other.
- no outsiders are involved in terms of investors, board, etc. no money raises, bootstrap from ground up
- $2.5k rev 2014 -> $370k revenue FY 2016
Gift? private stock sale? Issue shares?
Thanks <comment><USER2> Entrepreneur here not a lawyer, but as a startup you want to keep costs low. Legal fees can be $10k+ just to issue new shares.

Unless you are profitable, I'd try delay doing this until a funding event and do what the the other commenter Siegel mentioned. Just get the commitment in writing or in a contract and don't go through the messy process of issuing new shares unless your business has product/market fit and is stable. Because before product/market fit you should worry only about getting to product/market fit. You shouldn't worry about sharing % of nothing. NOTE: revenue =/= product/market fit.

But make sure you do it before, or at the same time you raise money.

If you can afford it, ask a lawyer if you can issue more shares to keep the %'s the same 50% shares outstanding and 50% common. Then adjust the amount owned by you and your co-founder. ie. issue another 10m shares, 2m go to your co-founder and 3m to you, then you have 20m outstanding, 10m common with 5m/5m. Get a price quote upfront for the work.

Again, I'm not a lawyer so this is NOT legal advice. I don't know if this is the most economical or easiest way to do it, but it's one way you might do it.

<comment><USER3> If anyone is charging you $10k+ to issue new shares, that's crazy!

<comment><USER2> most early early startups don't keep up with legal, so when it comes time to issue I know a lot of startups who had significant clean up to do

</comment></comment></comment><comment><USER4> So everyone here is right, you can issue new shared no problem at all, BUT no one has mentioned tax implications.

If you gift someone shares they have to count them as income. On day 1 when you valuation is arguably $0 this is NBA. 50% of $0 = $0 but today 10% of your business at a conservative 5x multiple is closer to $200k. Might be more, might be less, but that's income and your partner needs to pay taxes on it.

This could be the worst/best gift they receive. Typically what you're describing is done with stock options. That is, granting him the right to buy shares at a future date at a fixed (low price). No matter what people tell you options != equity. You can approximate what the right number to give him are but it'll never be the same as having 50/50\. If you want to give him 50% you should issues shares, but make sure you give him a big cash payout (hint: also taxed!) so he doesn't end up underwater.

<comment><AUTHOR> is 5x multiple on revenue conservative? That seems to be the golden question here...the valuation and how to justify one. Multiple on EBITDA?

</comment></comment><comment><USER3> If you agreed to this 50/50 split a while ago, then you could deem that an oral contract as of that date. If your revenue was less at that point, then you could justify a very low stock price (and, thus, a minimal or no tax burden). All you would do now is document that oral agreement in writing, dated as of the date of the oral agreement.

<comment><AUTHOR> Even better - I have the intent to equalize in early 2016 board meeting notes...good idea

<comment><USER3> Perfect! Good thinking (intentional or not).

</comment></comment></comment><comment><USER5> You will probably get some good advice here but just wanted to recommend getting a lawyer and accountant involved to make sure you minimize any tax liabilities and do it the right way for your state/country.

Congrats on a successful company.

<comment><AUTHOR> Yes absolutely...currently have both just poking around for 2nd opinion :)

</comment></comment><comment><USER6> Issue new shares to reflect the agreed shareholding structure and do it with the aid of a lawyer.

Right now, based on the information you provide, you do not have a 50/50 split. It still stands at 60/40 and if there is ever any dispute over it, its your word against his.

Handshake deals and verbal agreements are alright but your best friend in business is a solid, written, legal contract

(disclaimer: IANAL)

</comment><comment><USER7> If it's just the 2 of you, it might be easier for the company to buy back his shares at the issue price. Need to check with your lawyer, of course, re: valuation issues, but if it's just the 2 of you it may not matter, and future investors will be understanding of what was going on.

</comment><comment><USER8> Are there any tech solutions for cap table management?

As an alternative to bespoke legal counsel.</comment>


Pentagon Hit by Unprecedented Cyber Attack - <AUTHOR> http://www.foxnews.com/politics/2008/11/20/pentagon-cyber-siege-unprecedented-attack/ <comment><USER2> "The Pentagon has suffered from a cyber attack so alarming that it has taken the unprecedented step of banning the use of external hardware devices, such as flash drives and DVD's, FOX News has learned."

WTF? Does this mean that they actually let pentagon employees bring flash drives to work and plug them into their computers?

The fact that banning such devices is considered to be "unprecedented" is proof positive that it's a good thing Bush is going to be un-presidented in January! :-)

<comment><USER3> It might not be so much as allowed as it was never explicitly disallowed.</comment></comment>


Middle managers may turn to unethical behavior to face unrealistic expectations - <AUTHOR> http://news.psu.edu/story/485920/2017/10/05/research/middle-managers-may-turn-unethical-behavior-face-unrealistic <comment><USER2> I've seen far more dirtbag middle managers than anyone on the top or bottom. Many want to make themselves look good, so will do whatever it takes.</comment>


Google Checkout Tries To Ring Up Market-Share Gains With Free Transactions - <AUTHOR> http://www.techcrunch.com/2007/12/12/google-checkout-tries-to-ring-up-market-share-gains-with-free-transactions/ <comment><USER2> It just occurred to me the other day why many sellers (especially eBayers who buy and sell in large volume) will stick with Paypal and not consider GCheckout before some major changes happen.

Until 2/1/08, Checkout is free, and Paypal is ~3%. Clear win for Checkout, except...

You can buy lots and lots of stuff with a paypal account. Not only that, but the money you get via paypal never leaves your paypal account. With Checkout, Google automatically sends the money you receive to your checking account (in my case, anyway), which means that if you receive $1,000 and spend $1,000, all of that is going through an offline account.

In other words, if you're willing take a slight risk of a very invasive audit (i.e., one that looks at your paypal history), receiving $1,000 thru paypal and spending $1,000 through paypal is all tax-free. Doing the same through google means you take the tax hit on the income.

If I didn't hate paypal so much and like checkout so much, it'd be enough to get me to switch over right away.

<comment><USER3> >receiving $1,000 through paypal and spending $1,000 through paypal is all tax-free.

Well, not really. $1000 may not seem like much, but multiply that upt to $100000 and make it your sole source of income and you can bet the IRS will be all over you. And it isn't you they'll be auditing, but Paypal itself:

[http://220.127.116.11/search?q=cache:oX20J-QVyBkJ:www.usatoda...](http://126.96.36.199/search?q=cache:oX20J-QVyBkJ:www.usatoday.com/money/perfi/taxes/2006-04-11-taxes- paypal_x.htm+paypal+and+taxes&hl=en&ct=clnk&cd=10&gl=ca&client=firefox-a) <http://www.pcworld.com/article/id,125368-page,1/article.html></comment></comment>