Each section contains a story of some situation he was in where he faced a problem which he solved by applying one of various algo techniques (DP, divide and conquer, etc.). After reading CLRS for a class, it was nice to see how some of the most common textbook algorithms have been applied by a notable computer scientist.
OK, this is an oddball one, in that a book on Evo Devo is pretty far from CS, but reading it completely changed how I look at software architecture, protocols, formats, programming languages, and a whole range of other CS-related topics.
Superficially, it is what it says on the tin: an examination of the mechanisms by which life manages to evolve at all, that keep most mutations from being immediately lethal, and instead have a decent chance of producing (potentially) useful variations.
But under the hood, I've found it extremely interesting how and why so many aspects of the living world are resilient and even antifragile, and there is are lot of useful ideas and concepts to mine beyond relatively superficial biomimicry like genetic algorithms, neural networks, or even "design for failure" approaches for software and services.
Read it, and you won't think about "Worse is Better", "Bus Numbers", or Chaos-Monkeys the same way ever again.
Basically it has you hands on work through the basics of every concept active in a modern computer save for networks and web.
You use software tools provided with the book to design memory, ALUs, intepreters, VMs, compilers Operating Systems and applications.
Available as a free online class at http://www.nand2tetris.org
Came out in November 2016. Split in 3 parts:
Part I: Applied Math and Machine Learning Basics (Linear Algebra, Probability and Information Theory, Numerical computation)
Part II: Deep Networks: Modern Practices (Deep Feedforward Networks, Regularization, CNNs, RNNs, Practical Methodology & Applications)
Part III: Deep Learning Research (Linear Factor Models, Autoencoders, Representation Learning, Structured Probabilistic Models, Monte Carlo Methods, Inference, Partition Function, Deep Generative Models)
This is cheating a bit, because the book is history of computer science rather than computer science, but I think anyone interested in programming should read it. We often think about history of computing (and what it teaches us) in a retrospective way (we see all the amazing totally revolutionary things that happened), but it turns out that if you look deeper, there is often a lot more continuity behind key ideas (and we just think it was a revolution, because we only know a little about the actual history). This book goes into detail for a number of major developments in (early) programming and it makes you think about possible alternatives. It was one of the books that inspired me to write this essay: http://tomasp.net/blog/2016/thinking-unthinkable/
I used it to supplement my prescribed compiler construction textbook and it's incredibly useful! Also surprisingly easy to read compared to some texts with a very math-heavy approach.
Writing Efficient Programs
Also has a great bunch of "war stories" about performance tuning in real-life, including one in which people, IIRC, improve the performance of quicksort on a supercomputer by 1 million times or some such, by working on tuning as well as architecture and algorithms at several levels of the stack, from the hardware on upwards.
Edited to change Wikipedia URL to more specific one.
Note, you have to be willing to put the time in, especially if your linear algebra is rusty or (like me) you have only a passing familiarity with complex numbers.
With that in mind, it's almost entirely self-contained and you can immediately start to make connections with classical computing if you're familiar with automata.
I've been interested in learning about quantum computing for a few years now and this book finally got me going.
As an aside it's a really great excuse to try out one of the many computer algebra systems out there. I gave Mathematica a trial for fun since I'd already used SageMath in the past.
Article:Thinking Clearly about Performance, Cary Millsap (Method R Corporation)
Grokking functional programming and deep learning seem awesome as well, but I haven't finished either so take my recommendation with a pinch of salt.
Edit: I'm not connected to the book.
It was a real eye-opener of what types can do.
# Elements of Programming
This book proposes how to write C++-ish code in a mathematical way that makes all your code terse. In this talk, Sean Parent, at that time working on Adobe Photoshop, estimated that the PS codebase could be reduced from 3,000,000 LOC to 30,000 LOC (=100x!!) if they followed ideas from the book https://www.youtube.com/watch?v=4moyKUHApq4&t=39m30s
Another point of his is that the explosion of written code we are seeing isn't sustainable and that so much of this code is algorithms or data structures with overlapping functionalities. As the codebases grow, and these functionalities diverge even further, pulling the reigns in on the chaos becomes gradually impossible.
Bjarne Stroustrup (aka the C++ OG) gave this book five stars on Amazon (in what is his one and only Amazon product review lol).
This style might become dominant because it's only really possible in modern successors of C++ such as Swift or Rust, not so much in C++ itself.
# Grammar of graphics
This book changed my perception of creativity, aesthetics and mathematics and their relationships. Fundamentally, the book provides all the diverse tools to give you confidence that your graphics are mathematically sound and visually pleasing. After reading this, Tufte just doesn't cut it anymore. It's such a weird book because it talks about topics as disparate Bayesian rule, OOP, color theory, SQL, chaotic models of time (lolwut), style-sheet language design and a bjillion other topics but always somehow all of these are very relevant. It's like if Bret Victor was a book, a tour de force of polymathical insanity.
The book is in full color and it has some of the nicest looking and most instructive graphics I've ever seen even for things that I understand, such as Central Limit Theorem. It makes sense the the best graphics would be in the book written by the guy who wrote a book on how to do visualizations mathematically.The book is also interesting if you are doing any sort of UI interfaces, because UI interfaces are definitely just a subset of graphical visualizations.
# Scala for Machine Learning
This book almost never gets mentioned but it's a superb intro to machine learning if you dig types, scalable back-ends or JVM.
Its the only ML book that Ive seen that contains the word monad so if you sometimes get a hankering for some monading (esp. in the context of ML pipelines), look no further.
Discusses setup of actual large scale ML pipelines using modern concurrency primitives such as actors using the Akka framework.
# Hands-On Machine Learning with Scikit-Learn and TensorFlow: Concepts, Tools, and Techniques for Building Intelligent Systems
Not released yet but I've been reading the drafts and it's a nice intro to machine learning using modern ML frameworks, TensorFlow and Scikit-Learn.
# Basic Category Theory for Computer Scientists
Not done with the book but despite it's age, hands down best intro to category theory if you care about it only for CS purposes as it tries to show how to apply the concepts. Very concise (~70 pages).
# Markov Logic: An Interface Layer for Artificial Intelligence
Have you ever wondered what's the relationship between machine learning and logic? If so look no further.
# Machine Learning: A Probabilistic Perspective (Adaptive Computation and Machine Learning series)
Exhaustive overview of the entire field of machine learning. It's engaging and full of graphics.
# Deep Learning
You probably have heard about this whole "deep learning" meme. This book is a pretty self-contained intro into the state of the art of deep learning.
# Designing for Scalability with Erlang/OTP: Implement Robust, Fault-Tolerant Systems
Even though this is an Erlang book (I don't really know Erlang), 1/3 of the book is devoted to designing scalable and robust distributed systems in a general setting which I found the book worth it on it's own.
# Practical Foundations for Programming Languages
Not much to say, probably THE book on programming language theory.
# A First Course in Network Theory
Up until recently I didn't know the difference between graphs and networks. But look at me now, I still don't but at least I have a book on it.
Maybe stretching outside the typical, but I have a weakness for cellular automata.
Also, I've vowed never to buy another Oriely book or similar book ever. Online docs are free and stay up to date.
Short answer for 'How do I learn powershell?' is:
* Learn 'select'
* Learn 'where'
Once you get those two, and get out of the scraping with sed/grep/awk mentality you now properly get powershell.
Basically means that if you can spend about one hour every day on the text and exercises in the book you will be able to grasp PowerShell scripting in about a month.
When searching for tutorials online, "the scripting guy" was useful, but more importantly I make sure to search for powershell v5, v4, or v3 tutorials. - There are lots of "old" tutorials, but I think there were major changes between Powershell v1, v2, and v3, so I try to avoid those, especially regarding modules
I started using Powershell and also stated answering questions on SO. The latter helped a lot in quickly improving my skills.
I have to use Windows at work, and do not know Powershell. Several times I've debated learning it, but never put in the effort.
Now I use Xonsh (http://xon.sh/). It is a Python shell - cross platform and similar semantics to bash, etc. I was never a power bash/zsh user (scripting in them is Hell). The nice thing with xonsh is that it is Python. If you want to customize your environment, have complex aliases - well, you just write Python code in your config file.
Learning PowerShell for Windows is the ideal. But xonsh is a good intermediate solution for people who don't want to invest in going all the way.
(To be honest, I'm seriously considering switching to xonsh for my Linux machine - currently I use zsh).
I can recommend the PowerShell cookbook too, though. I've been a technical reviewer of the 2nd edition and at least back then it was good :-)
Seems like a pleasant platform. Thanks for this thread.
In other words, think of something you want to script, then try to learn how to do that in PowerShell.
What I think you'll find if you try learning something as vast as PowerShell with a general approach is that, whilst you may pick up some decent general habits, you'll also find yourself learning a whole bunch you never use.
Learning PowerShell is different from learning a conventional programming language as each use case you'll have will make use of different commands. It's like having a DSL for each use case. You'll use different commands for Active Directory management, for Azure management, for file processing, etc... As long as you know the basics you can pick up whatever is going to be most relevant for what you do.
I think it's this guy: https://www.pluralsight.com/courses/powershell-intro
In this regard, few tips:
- Install apps via Chocolatey. If app is not there create a package and maintain it. AU framework makes it one time development event. See this report: https://gist.github.com/majkinetor/a700c70b8847b29ebb1c918d4...
- Your profile is very important. I use profile.d which can be reused easily on all your machines: https://github.com/majkinetor/powershell_profile.d
- Use Powershell Gallery and modules in general. Make module or reusable component for everything. See my work here:
- Make sure you use mandatory cli tools:
cinst conemu less peco sysinternals everything copyq
- Do not use junk GUI editors such as ISE. Visual Studio Code is way better if you have to. Sometimes is OK when debugging. I would suggest vim because speed is of great importance in shell world.
- Follow reddit community and ask questions there rather then on SO which is full of achievement biatches. Redditors will help you for free for the joy of sharing the knowledge.
- Use Github to store all your stuff. Also, in coorporation you can use NAS share to let anybody import stuff from there.
- DO NOT LISTEN naysayers about aliases - use default alises all the time. They are cross-platform and well known and I can go into neurolinguistics of why is it better and easier for the brain but I don't want to do it here. People will certainly whine now but ignore them. DEFAULT (READ ONLY) ALIASES ARE THE BEST. Particularly, if you see somebody does foreach-object or where-object just kill him ASAP.
- Do ALL windows config from Posh. If you don't know ask around. If you are devops dude, you can thank me later, especially when you learn DSC and apply all that knowledge there or with boxstarter.
- If you happen to be locked in older posh use PSReadLine. Keep in mind that $host.Version -lt '3.0' is full of surprises and use latest version if possible.
- Do not compromise with others in coorporation. Ask for script for everything. If sysadmin tells you that server is low on disk you ask for proof in the form of the command you can execute. Ask for invoke-sql when using databases. If you give admin a job to create a IIS site for your web app ask for a script. If you are a project manager, do not close tickets without a script.
- If you monitor vendor excursions in your company infrastructure, ask for transcripipt of ALL operations they do. You will thank me later. Do not sign their work without it.
I can recommend "Windows Powershell In Depth"https://www.manning.com/books/powershell-in-depth-second-edi...
And if you don't enjoy PS almost every single moment you are doing something wrong.
PS: I do not work for Microsoft :) I just think bash and friends are ridiculous in 2017 and honestly a little embarrassing. Do not do that - install Powershell on Linux and Mac if you have to and keep your sanity.
PS2: Somebody will certainly say that ruby/python/whatever is great on linux side. Ignore them. Those are not shell languages (while great otherwise and valuable in your skillset - cinst ruby python etc. is among my mandatory stuff but lets keep perspective here).
Hell, I even found a C# code snippet and was able to add into a Powershell string, then add this as a C# type definition, and Powershell compiled it to an assembly and then loaded it as an instance of a Powershell object.
2. I found how to do this here: https://blogs.technet.microsoft.com/stefan_gossner/2010/05/0...
Start small, with ls, cp and cat, and don't force the pace. psh is a shell first and foremost- a shell with a very nice language, but a shell all the same. So get comfortable using it as a shell.
First thing is to create your $PROFILE. Google for an example and see if you can edit it to suit you. Then get chocolatey, PSCX (psh community extensions), posh-git and vim, and get used to doing most of your work on the command line (like you'd do with bash, on Linux). See what tasks you can automate by writing a few short scripts- very simple things at first, like copying and renaming files, setting up directory structures and so on, then progress to processing xml and setting up scheduled tasks, and sending email, setting up credentials etc. After a few months you'll find that you can wean yourself of windows GUIs for most of your everyday tasks and probably all of your not-so-everyday ones.
psh being a command-line tool, it's far easier to learn it like that, than trying to learn the language first. You can learn the basics of the syntax allright, but there's a bazillion commandlets that you will never be able to remember, unless you use them in your everyday work, and incorporate in your scripts, and those commandlets are often integral to the use of psh. Basically, you can't separate the language from the use of the shell, so you shouldn't try. Learn them both at the same time.
% % %
I guess that company didn't want to shell out for more windows server licenses and so there was a limit to the number of people who could rdp to a server at the same time- just two or three people per server. So there was always a bit of a queue and I often had to wait between a half hour and a couple of hours before I could get a slot. Or someone would go for lunch and forget to log out, and you had to kick them out and it was generally a big drag.
At some point I started using psh as my windows shell, and then I found out about windows remoting , which sounded a lot like ssh on Linux- basically, it lets you open a shell on a remote computer. Next time I had a slot on a remote machine, I enabled remoting and suddendly I could do all the work I needed on the command line, while everyone else still had to wait in line for an RDP slot . Needless to say, this made my life and my job a hell of a lot easier, not to say pleasant (I might have had a few smug smiles on my face, at times).
I'll note there was only one thing I couldn't do remotely: running a proprietery installer for the company's platform, that only had a gui and no command-line options. Everything else, including a whole bunch of SQL stuff, I could do it remotely, on psh .
All this naturally pushed me to do more psh scripting, as it was easier to run a script than key in a dozen commends on the command-line. So I left that job feeling very comfortable with powershell, and although I didn't quite have to use it that much in any other job since, I still use it as my primary shell at home.
 I think it started with this article, whose title immediately caught my attention:
 Noone else cared to learn powershell. I did ask. They said they didn't want to have to learn a new programming language. To be fair, I never explained my remoting setup to anyone, because they would probably tell me to stop using it (I was just a junior dev at the time). Note also that I never enabled remoting on any of our public-facing servers, just in case there was some vulnerability that could be exploited.
 I also used vim and netrw to edit my scripts on the remote server directly, over a UNC path, so I didn't have to re-upload them every time I needed to change them. This was a very Linux-y way to do stuff and really unusual where I worked.
It wants to be a pseudo C# but without being C#. And anyway you can use scriptcs nowadays to write scripts in C# (or even better: .fsx scripts, with F#, which is more succint, less verbose than C#).
Hint: nothing. I've just finished a year-long vacation from dealing with startupcanistan. It's been wonderful, though I'm probably heading back soon.
It's totally normal to get burned out on something that hasn't been directly rewarding to you--ignore the bullshit echochamber and media about our "industry".
Ruby on Rails is sort of the basis for most any other modern MVC web framework. That is to say it inspired nearly every other web MVC framework, in most other languages. If you can use Rails you'll be able to use most anything else. Prior to Rails most web apps had proprietary frameworks powering them or no framework and were just an bunch of "pages" (endpoints) loosely strung together.
Rails also, for better or worse, has one of the easiest to use ORMs-- ActiveRecord. This helps new folks worry less about the intricacies of learning SQL (or whatever your persistence layer is) and more so about what writing a web service is really about.
Ruby as a language is also very expressive, is truly object oriented, and has all the right building blocks (that's kind of a pun actually), plus a very large amount of documentation and examples. It also is very good for meta programming which is what enables a lot of the rails magic (and fun).
At the end of the day learning more languages like PHP, Python, Java after Ruby is fairly trivial. I always tell noobs to learn whatever is useful for them, and stop worrying about what language.
I started with Ruby 10 years ago and now can write Java, PHP, Python, Scala, Elixir, Objective-C, and Swift; though I am by no means an expert in all of them. At some point you'll realize you've learned concepts and they're what is important. Not syntax.
P.s. don't let my username fool you ;) I'm just unfortunately hipster.
Edit: added some thoughts on why your first language isn't so relevant and a bit of clarity.
Edit 2: fixed absent minded use of rails where I should've written ruby.
Full disclosure: I went to engineering school for 2 degree and then later attended (and currently work for) a code school.
I can say that I can see a marked difference in students that go through Ruby as a first programming language vs JS. Ruby-first students are more ready to deal with new ways of doing things and they are, in general, less likely to have serious learning issues. JS-first students tend to have more consistent problems grasping things like scope and return values. It IS possible it's bent as such due to our curriculum, but all I can tell you is what I've seen in our students.
In the late 2000s, the popularity of Ruby exploded when Rails gained mindshare. Rails, along with its healthy share of innovations  and productivity gains , was a good fit for code camps because it took little effort to crank out a basic CRUD app. Such fast feedback is very impactful on people who are just starting out programming.
Despite other frameworks borrowing from RoR in the years to come, Ruby's culture is largely compatible with the notion of 'programmer awesomeness' -- where a motivated coder is given a powerful toolset and is allowed to do great things, even if they're a bit quirky -- and is lighter on idiomatic dogma than some other languages that are popular for greenfield development today. While those idioms and mores are an asset to the languages that have them, they may stifle independent exploration and make people more afraid to make mistakes, which are quite detrimental to new learners.
 https://news.ycombinator.com/item?id=12758085#12761705  https://news.ycombinator.com/item?id=13196431#13197538
Rails has the benefit of providing a framework that can get someone building functional CRUD apps in a tremendously short period of time.
Between those two, you've hit a nice sweet spot where someone can be fully functional as a developer in a short period of time (talent/quality/patience aside).
And why JS? Because that is what runs in the browsers.
Those programs are three months out of your life and then you're back to learning on the job and in your free time like everyone else.
I think a dynamic OO language like Ruby or Python is a great place to start but it doesn't really matter. Any mainstream language would be fine.
I think the auto-magicness of Rails helps, since it gives you so much even if you are relatively inexperienced. Then you have a jumping off point, to start learning on the job, earning money and you can ostensibly choose your own adventure from there.
edit: I'm not sure what's objectionable about this comment. I'm new here and trying to be helpful, so if I've gone against some rule, I'd like to know so I can learn from it.
A lot of concepts can be handwaved when you're using a language that doesn't support them. Js is easy to learn and widely useful.
- Ruby has less of a learning curve in contrast to a lot of other languages, though the margin is definitely narrowing with ECMAScript
/end rattling my cane
Rails is probably chosen mostly out of the false tradition that Ruby is a good beginner's language or the also-false tradition Rails is a good framework.
As someone who ended up learning Ruby (and Rails) for a previous job, I can attest that it's a great language from a learning/teaching perspective. Huge ecosystem, the syntax is actually readable, you don't have to fiddle with compilers, and so on. As mentioned in other comments, Rails is also the archetypal MVC framework, for better or worse; while I don't personally care for it, it gets the job done and is in relatively common use; in terms of getting students from zero to hireable quickly, Rails knowledge is pretty useful.
The downside - ask 10 people for an example of proper use of advanced oop in js, and out of these 10 you will get 5 passible anwers all of which will be drastically different - horrid thing for production
In general enumerating domains is not really possible (you can't just dump all North Korean domains for example, and people have tried).
I'd start by figuring out how they are blocking sites. Probing to see which IPs are blocked would be much easier. There are various tools to lookup which sites are hosted on a given IP address (using crawled data).
One way to do this would be to try connecting from outside Pakistan (e.g. EC2 server) and from inside and seeing if a IP is blocked.
Scanning all 4 billion IPs surprisingly doesn't take too long on a modern internet connection.
Your problem will come from the countries/TLD's that dont play ball with their zone files. These are trickier to obtain.
You'll find lots of people saying Diamond has been "debunked" but by that they mean "here's some criticism someone posted online". It's a remarkable work of analysis tracing the causes of human progress over thousands of years.
Fukuyama is a real realist. What I mean by that is that he doesn't deny that progress has occurred (something some people believe), but he points out how precarious that progress is and that it can go away (something some people deny).
I don't understand why it's a controversial statement to say that progress isn't inevitable and that decay can sometimes happen, but for some reason it is. I think his books, among many other things, are useful for grasping that progress takes hard work and can, like anything in this world, be ruined by laziness, corruption, or simple accidental misfortune.
Both were turned into TV miniseries by the BBC (plus a successor to Connections that I haven't seen).
The Measure of the Worldby Denis Guedj
There is an excerpt here:
The matter is interesting and IMHO very well told, as besides describing the peregrinations of the scientists it gives an insight into the period, the science revolution and Enlightenment.
One man's journey towards enlightenment, learning, experiencing, and progressing through life the entire way.
It's what happens with the human race if the moon crashes into the Earth.
Amish are not my cup of tea, but they are an interesting bunch.
A key point in the theory, is that it is decentralised. Keybase isn't.
What you're enjoying is just public key infrastructure, and GitHub integrating it well.
It's cool it exists, and works well. But it's hardly a Web of Trust.
But a lot of the major players (e.g, Webpack/React/Angular[!2]/TypeScript/etc) have all been around for more than a year, so context is important.
There is a ton of activity in the space, of course. I would first glance at the ECMAScript efforts of late (ES6 and ES7 in particular). You'll probably need to use Node.js, since it tends to be the center point of JS development, regardless of the tools and frameworks you choose.
The first piece is your build tool. Grunt and Gulp are the two top build tools. Gulp is more recent and seems to have more uptake. If you haven't written a build script (e.g., gulpfile.js) I recommend building one up from scratch rather than using someone else's. You could use others' for examples of what to do, but build your own from scratch according to your needs, as you go. You'll learn more and understand the whole thing that way.
The next choice is whether to use a transpiler or not. The two biggies are Babel (ES6 transpilation to ES5 or ES3) and TypeScript. You can skip this step at first, but it will be a foundational aspect to your build, so don't wait too long. If you do skip it, loop back once you've made your other choices.
The final big choice is framework. The big ones right now are React and Angular 2. There are many others, of course (Vue, Inferno, ...). You might try a few efforts here to learn about them if you don't have a clear initial default choice.
There are secondary choices depending on which main framework you choose. For example, if you use React, you will likely need a client-side store. Flux used to be the default. Now it's likely to be Redux or, more recently, MobX.
There hasn't been a better time to be a JS dev. There's still a lot of churn, but there's also more stability than there has been in the past few years. You can stick with technology choices for a year or two without major disruption if you make course corrections. Good luck!
IMHO to be a good frontend developer you need decent comprehension of JS/CSS/HTML. Some framework experience. Some backend / upload knowledge. Know git. Not an asshole to work with.
To be a better frontend developer you need human skills, strong raw JS, the ability to move between frameworks without whinging, and solid knowledge of cross-platform desktop/phone/tablet/TV development. Can happily code a frontend direct from either an API spec or a vague informal concept. Have written and used automated tests with git.
To be an awesome frontend developer you need all of the above but are comfortable doing web as well as multi-platform native development, can run docker or another toolchain for rapid iteration and integration with backend developers and QA teams, have great people skills, have executed multiple projects where security/reliability/offline mode/multilingual design were front and center, and have learned basic lessons about cutting corners by maintaining at least one or two nontrivial projects long term.
Strange times, isn't it? 10 years ago, a front end job would require a comprehensive understanding of CSS, the DOM and JS. Now it's all about framework X and Z, build tool A or B, Typescript and what not, like these tools are so complex one has to be a specialist in these tools because they can't be learn in a few days.
Meanwhile, micro-services are all at rage on the server and back-end developers deemed big frameworks like Rails,Spring,Symfony and co an anti-pattern because complexity is bad (Go)? But stupidly complex tools and frameworks on the client are OK?
Ada - The type system and the manner in which it can be used to constrain your software (in a positive way) makes ensuring certain safety/reliability much easier. Compare in C, an int is an int. If I make a "temperature_t" it's just a double or something that's aliased. Where as "kelvin_t" in Ada can be made to be only the positive real numbers.
Lisps - I'll include Common Lisp, Emacs Lisp, Scheme, Racket, clojure, etc. The meta programming (ruby has this too, actually) makes it much easier to develop large programs almost automatically. The meta programming nature allows you to, within the same language as the primary program you're aiming for, extend your language and program. This reduces the friction of the meta programming tasks, consider C. You can use meta programming, but it requires at least one other language.
Plenty of others, three (languages and families) off the top of my head.
And Shen which has a Turing complete type system meaning it is very flexible but type checking may never halt in certain conditions. I do not know of another language with these properties.
Haxe allows you to target absolutely anything and if you miss some exotic it is trivial to allow generation for it. It is also quite mature language with a macro system. Again, maybe MonkeyX compares somewhat but has far less backends and making a backend is not so straightforward.
K and Q and their parent APL which allow you to write the most terse code you will ever see (some make a sport of it).
Forth you can implement in a few hours on any platform and yet is a very powerful language which makes it easy, once you get used to it, to write terse but easy to understand code. This one I would say is, compared to other languages including Lisp, easier to implement naively while still keeping solid perf. There are also lists of minimal instruction Forths which show you how powerful and easy the basic constructs are and how rapidly you can make a toy language.
One-line that reads the file, splits multiple lines into an array:
<?php $l = explode("\n", file_get_contents("in.txt"));
$trimmed = array_map(trim, $l);
$unique = array_unique($trimmed);
Also, the project is an interesting technical solution in and of itself.
1. Focus on becoming a good programmer (ie, SPOJ/Topcoder/Directi). That'll help you clear interviews, and get good at thinking about algos and data structures. I'd even prioritize this over other CS fundamentals.
2. Keep your GPA up and get into a good grad school. I disliked both the interview process and the classism (ie, recruit from top schools) of Indian companies when I interviewed there.
3. If you don't want to go to grad school, make sure you don't touch TCS/CTS/Wipro/<insert mass VIT employer here> with a 100-foot-long- pole. Given your passion, and assuming you use the next two years to become a strong programmer, you will find a good place to work in Bangalore. You might have to pay your dues, but please don't pay them at the above mentioned places.
And people who look at you as second class undergrads can fuck off (esp the professors at IIT Madras :) ). I know several friends at IITs that preferred to pot-smoke-away their time there. If you're near Chennai I'm happy to chat with you.
1. Build a strong CS and Math background, especially since you are interested in AI, ML. Academia is the best place to do this. Look at the curriculum of top engineering schools like mit, cmu for your sophomore year and see how you can complement it with the courses you are taking. This will pay you dividends in future. You are already doing that, which is great! Try to add more structure to your execution.
2. Take advanced courses on the topics you are interested as you get to your senior year. A lot of MOOCs have entry level courses but lack on advanced topics. You will find these scattered across university lecture videos, you already mentioned OCW.
3. For prototype projects try building things from the ground up. For e.g. Taking an Operating systems course great, build a simple filesystem from scratch. It will help you in understanding the complexity involved in production grade software and why certain design choices are made.
4. For the projects that you are passionate about deep dive into it, its great to see people talk about their projects with deep technical insight, pros and cons of design choices made etc.
5. Personally I would avoid learning every new language that comes up, focus more on programming language concepts (there is a course of Coursera on this) and learn few languages well.
6. For internships look for startups that are working on interesting ideas.
7. More than the certificates the projects what you did in those courses are more valuable.
8. Enjoy, make good friends, stay healthy and active.
Learn "software engineering", this has nothing to do with language, framework, algorithm or tooling. This is about code organization, managing complexity in code, deciding how to structure/architect an application. This is where you are going to read what some will consider "boring" books, these books will hold very strong opinions and are not exact science. You will have to take that knowledge, apply your experience and come up with your own reasonable opinions too. Here are sample of such books in my library, "Business Process Management", "Ship It", "Architecture Principles", "domain driven design", "Enterprise integration pattern", "Clean code".
The real world doesn't care what language, framework, algorithm or tool you use. They just care that you solved the problem. This means you must understand some other domains outside of tech. If your domain is only tech then you will be building tools for programmers/IT folks. If you understanding banking, insurance, health care, automotive, shipping, etc, you could apply your knowledge towards the difficult or poorly solved problems in those areas.
If you become well rounded, you will have the skills to implement, the domain knowledge to solve pressing problems, but more importantly the wisdom to know when to and when not to break rules.
Colleges rarely teach you what you need to know professionally - they can't, tech moves too fast. Instead, they teach you how to learn what you need to know. This is an important distinction because it should inform your approach to your professional growth.
1. Stay passionate both about software and your own growth/education in it.
2. Start some personal projects and, important, work on them until they reach a place where you can talk about what you learned, the techs you used and be able to at least show a page or two of it working.
3. Be forthcoming in interviews about your desire to create. The longer i am in software the more importance i put on hiring creative people.
Finally, think of software development as modern day blacksmithing. Those who do well have a few things in common: passion, persistence and a great set of artisans (mentors) to learn under. Prioritize finding some people who have compelling opinions on software development and work with them. It will change how you build software and the value you will bring to teams in the future.
1. The level of programming taught in Indian universities is not enough. Writing a sort program is quite different from writing good, maintainable OOP code. Apart from working in a good company, one way to develop this skill (which I feel is critical) is to look and contribute to good open source projects - elasticsearch, spark, etc. Unfortunately I don't know of any good books which teach this overall, apart from specific aspects like Effective Java.
2. Another aspect that I feel is missing in Indian universities is challenging assignments. I would have liked to write my own toy OS to learn systems, or toy kafka to learn distributed systems. The more core computer science fundamentals you master now (preferably through writing code along with learning theory), the better an engineer you will be later.
3. Another aspect that is lacking is the way to reason through things. Indian universities have a third-person approach on the lines of "the experts do things this way so we will just do it this way", on the contrary in a US university the reasoning is more on the lines of "we use to do X, that had Y limitations. So we moved on to Z, now your assignment is to design an extension to Z (say Z+) which solves YY limitation". Unfortunately, I don't know what can be done to improve the way we reason about things.
4. Don't forget to explore different areas. I started with computer graphics, moved on to compilers, then app development, then data engineering, then infrastructure development, then back to data engineering.
1. Apply to startups. If you are looking to apply to the big four, make sure you do your diligence and work hard at coding contests.2. Practice peer-teaching. VIT is a huge college. There are more people like you, and you can easily help each other by doing projects together.3. The industry, in general, rewards freshers who have worked in large teams and projects before. 4. Make sure you get a good internship. Shouldn't be hard for you, but if you are interested, drop me a mail (Razorpay, Bangalore)5. Go for depth first and then pick your specialization within software. For me it was Web Development and Software Security. Could be anything for you, but make sure you have tested the waters in other fields before picking one. The one benefit of College Life is that you have time to experiment and fail. You can try out projects in all these different fields, and then decide what you are really passionate about.6. GSoC is a great option. I'd recommend trying for a experienced org over a new one. 7. Avoid freelancing, unless absolutely necessary. It rewards short term gains, over long time learning. You can make much more money cloning WordPress themes and reusing them across projects then learning a new programming language. The latter would help you much more.
I'm very interested in Software Education in India, and if would like to talk more, drop me a mail (email in profile).
Many posts here emphasize direct skills, but it is important to understand that the modern workplace requires a broad range of skills in particular related to communication. One specific communication methodology which is worth learning is Nonviolent Communication which can enable people with different contexts and points of view to have useful conversations that resolve significant conflicts.
Go and work somewhere where your university's reputation is unknown, then people will rate you on your work rather than the university you went to.
I am going to go off on sort of a tangent and offer you some general advice:
1. Do not worry about what other people think. You mentioned in the beginning of your question about being looked as "second class undergrads", and that is completely false. As Rainer Maria Rilke once noted: "Your life is so inexpressibly your own..."
2. Build things you are passionate about, and not because they'll help you land a job but just for the sake of building things. If you are interested in artificial intelligence or machine learning, learn about them and build something. Better yet, keep a blog and write about the process of learning about AI, ML, etc. Don't be afraid to email some people you look up in the industry for guidance.
3. Keep learning, learn about anything that sparks your interest. Nothing is boring in its deepest essence. There's always something to learn. And if you know a lot, teach it or write about i.e. set up a repository for other people to learn more about it in an easier way.
Above all: Just be you. Don't label or attach yourself with certain identities. Build great things just for the enjoyment of building things. Love the process of building things. Collaborate with friends and colleagues. Go boldly.
Learning, building, etc. is all a joy. Don't try to be the best _____, just build stuff that matters to you.
But things are much simpler than that. Programmers solve problems and even the most revered programmers are just solving other programmers' problems. If you are building stuff, irrespective of size, scale or complexity, you're on the right track. Snub the anxiousness of not studying in the top-tier college; it won't matter few years down the line. I certainly can relate to zealousness of solving complex problems, but in my view, it's certainly not a prerequisite for personal fulfilment, or success, for that matter.
In day-to-day work, I am yet to use anything related to AI but every now and then, I find immensely time-saving project that just solved an insignificant problem.
Look - since you are passionate about solving problems and making things, why don't you just create sources of passive income or build some business from the ground up? This way you will be able to bypass any reputation issues that your university has and focus on your creativity instead.
You are already on right track. Just complete the Graduation as it is required by many companies(and visas if you need any in future). Go for fundamental courses more on MIT OCW and others. I also studied in a private engineering college from India(2010-2014). My rant at the time here: https://nainomics.blogspot.in/2011/11/welcome-to-indias-high...
I just focused on my learning. Some professors were encouraging. That helped.
One anecdote: I made a heroku style PaaS for my final year project(like dokku). My professors couldn't understand what it does and why is it even necessary. Their main point was we have "shared-hosting" services to do these(I had to go from php to java/python example then :P). Now after two years they have their industry peers saying docker all over and have called me several times regarding that.
I am now Backend Dev building APIs with Python(Django) and Elixir at a small company. I also have small Open source contributions under my belt. Contact me if you need someone to talk to
But I would say that you're in an environment where everyone cares greatly about credentials, because that's all anyone has so far. Once you graduate and have worked for a few years, people don't care so much about the credential. It may matter some, but it matters more that you can actually do things.
So you need to get a credential that is good enough to get you a job. But it matters more that you actually know what you're talking about, rather than just being able to repeat what the professor said. You need to understand, not just memorize. You need to be able to write software that actually helps people do things, not just classroom exercises. If you can, then you will surpass many who have better credentials than you. It may take a few years, but you will pass them.
They have a well regarded neurophysiology lab that was run by Marcus Devanandan. Perhaps you could do research / collaborate with them.
What I really care about when I interview you is how you answer my questions (this doesn't mean that I expect you to be able to answer every question fully), how well I can gauge the depth of your knowledge, and whether or not I think you will listen to senior engineers, learn what you need to do quickly and with an appropriate level of mentorship, and be a team member rather than someone trying to do his/her own thing.
Ok, I'll admit that someone who went to a for-profit school is going to have a higher bar to pass, but I haven't had to worry about that yet.
Also, what do you mean by "at par"? Status? Money? Knowledge? Expertise in a given area, and if so, what?
I hesitate to give you advice since it sounds to me like you're pretty busy already.
You want the people you know (and who know you) to have their idea of you intertwined with what you want to be doing; now, everything they encounter that has to do with that will get funneled your way.
All that matters is your passion and how much you put into the work you do.
I went on an exchange for a year to UCLA and this was when I started to feel something similar to the sentiment you're expressing here.
I'm now in my 3rd year of undergrad EE and for the last year I've been trying to fast track myself into the AI / ML field as I've been increasingly regretting my EE major and becoming more and more interested and passionate about ML (particularly the intersection of ML, altruism and design): I got Norvig & Russell's textbook and read it in outside of my engineering classes, read less technical books like Nick Bostrom's Superintelligence for motivation / food for thought, made a simple collaborative filtering recommender system using the movielens open source dataset, moved away from the web dev stuff I'd been doing in 1st and 2nd year and tried to hone in on improving my algorithm and pure CS skills, watched a load of AI / ML videos to try and get a better sense of who's who, where's where and what's going on etc. in the field. The "dream" (I use that word loosely) is to do the google brain residency program instead of a PhD, or the U Chicago data science for social good fellowship, so I've been trying to figure out how to get myself into good shape for either of them.
It's been overwhelming at times, largely because I feel like 1) I'm not in the "right" major, 2) I've had a taste of but no longer "go to" UCLA (or an equivalent high ranking university) and won't be graduating from there so will need to work hard to stand out against the competition for placements / fellowships / internships 3) I don't have mentors or peers who can help me navigate the field (I have a great relationship with a lot of my engineering professors but again, it's not ML). So I'm sort of trying to make sense of it all myself. It's reassuring to hear there are others feeling similarly and it's great to hear all that you're doing!
On a positive note, I suspect you may be overestimating the educational superiority of the top tier schools (I know I certainly did before I went to UCLA) but at the same time I don't think it's fair to completely disregard the big unis and just say "circuit theory is circuit theory" and forget about it. While I was there, I really didn't notice all that much of a difference in terms of course content or even teaching quality - the biggest difference was there were an awful lot more high achiever students in my EE classes compared to in my home uni in Ireland, and there was a much more impressive "career fair" and internship opportunity scene than at home (think Irish Cement vs Hyperloop One).
You seem to be doing everything right. I think I was edging down a "burnout" path a couple of months ago with fretting over what you're saying and over my own EE vs CS major "challenge". I've tried to take a step back and remember that there's no one enforcing a particular pace or path for me, hopefully you won't let the fretting get in the way of your passion which almost happened to me.
Just wanted to comment this to warn you about the burnout thing, reassure you somewhat about top schools and throw in a few links you might find interesting for good measure!
You mightn't find any of these links below helpful, you very well may be much more well read than myself but I thought I'd link these here anyway. The first is a reassuring AMA on reddit from the google brain team (particularly the comments where the team talk about all the different backgrounds everyone has at google brain). The second is a list of programmes, fellowships, resources and random AI / ML related pages I've encountered in the last year (amongst a lot of other stuff ). The third is a playlist I made for a friend on interesting AI / ML videos which you most likely will have seen before but you might just enjoy anyway. The quick interviews are cool if you haven't seen them already.
Anyway - best of luck!
One thing is to just learn the subjects and get as good a grade as possible. Even if a class is subpar, just learn the subject. I had to submit an assignment once about process scheduling in Linux etc. After ten minutes study, I knew I had an A+ on the assignment already. But I had always wanted to look into that topic any how, so I spent several more hours reading about it for myself. I always wanted to learn about scheduling, and if I punted on it then, when would I ever study it? If I did that all the time my skill level would be high.
If you study and get good grades and have a good relationship with professors (go to office hours and schmooze a little, pay attention and participate in class and be prepared and listen), you can always apply for a Masters at IIT or elsewhere. So you can still get that name if you want it.
If the subject is theory of computation and the teacher is sub-par, just go above and beyond. Learn about big-O and the squeeze theorem and pushdown automata for the class, but for yourself as well. Read (some of, all of) a non-assigned book on automata theory if necessary.
Insofar as projects, one thing I suggest is doing projects related to coursework. Toward the end, or right after a class on C++ - write your own C++ program, or fix an issue with a Github hosted C++ program and send a pull request. If it is a graphics class on OpenGL, write your own program in OpenGL towards the end or right after the class - maybe explore iOS/Android OpenGL ES. Or look at scikit-learn after an AI class. Ground some of the theory you learn in class with application.
Your classes covering concurrency and threading and critical sections and mutual exclusion may seem boring in school, but if you're a programmer you will run into these things and you will be happy you learned how to deal with it properly a few years back, even if you haveto go back and read up on it. The AI stuff may sound exciting, but getting all these details right together is what will get you to be a good programmer.
From what you wrote, my main advice is don't be too all over the place. If you have a class in databases and a class in Java, that semester, spend a lot of time learning about the theory, and maybe a little time in application setting up MySQL on your desktop and writing a Java program to populate kt. It's OK to have one other side project going at a time of something that interests you, but you should be spending a lot of time learning about databases and Java.
If you have time on your hands, just dive more into it. For example, in the USA, a drink may be 2.5 liters. In some countries that is 2,5 liters (comma, not period). I once submitted a patch to a Java project doing a switch/case by country. The upstream told me the Java had a DecimalFormat class that already did that. My method was a waste of time, and also less complete. It was something about Java I nad not learned. You're just scratching the surface in class, there's a lot of ground to these subjects.
So get a good grasp of each subject you study. Meanwhile, if you have an interest or specialty you'd like to pursue, do that as well.
As an experiment I posted my side project in subreddits related to what the project's about. I went from ~15 registered users to 45 registered users in a couple of days. Google Analytics showed ~300 new users in 1 day and ~3000k page views within a couple of days.
Just by posting there and using Google Analytics for the most basic metrics, it boosted my site's ranking in google searches which helped. The numbers I got back are tiny, but it's fun to see new users still signing up and adding data to my project.
I know it's counter-intuitive, but, trying to find customers is actually a mistake! It's too much work for too little return.
The right approach is to devise a method to find someone who will find customers for you. This might be deeper than it first appears. Consider this example.
My current budding project (call it E) is a tool for students who are having academic problems. Before, I would have tried to convince students that E would help them. Instead, my current approach is to find people whose problem is not to improve their own academic work but to improve the work of others. My value proposition is directed at them not at students. It is their problem I am trying to solve. E solves their problem by giving them something they can offer to students needing help.
Now my effort is to approach academic advisors, tutors, remedial educators, learning disability psychologists, and the like via professional associations and activities. In a sense, these people have become my market NOT the students. They will work for years for free and share their success stories to fellow workers. This sustained compounding effort is the sort that can lead to exponential growth.
Devising a method to find such people can be difficult. Deep thought is needed.
Who really are your customers?
These advice can give insights but are rarely directly appliable to side-projects. What you want is a constant, predictable source of people genuinely interested in your project, rather than growth hacking your way to the exponential explosion.
The best way to do it for a side-project is to have access to and trust from an audience.
There are two ways to do it. Write a blog and be part of an online community where your target audience hang out. That is why the advice of having experience at the industry you are focusing is even more a sine qua non than with startups.
Both actions are actually very complementary. Regularly write interesting posts on your blog and create an audience with time. Regularly contribute at HN or subreddits or Twitter or whatever and gain trust.
In both strategies be sure to be useful and deliver value not necessarily related to your side-project. If people sense you are only doing that artificially as pure content marketing, you will lose their trust.And for one-man side-projects, this kind of trust it is even more important than to startups.
* I work directly with a couple end users who really like the project, which gives much better feedback than posting on reddit, etc
* Build features that help more technical users (in my case, facets for programming languages)- people who come from HN / twitter give better feedback, write better tickets, and are more able to tell others if they like the app
* As far as promotion, I've had success with HN comments, guest posts on dev.to, and the startups reddit. All three have exposed the app to people with much larger audiences.
* The email lists Cooper Press manages are good to write for, because they pick up a lot of their content from niche subreddits.
* People who write articles about you rely heavily on material you've posted about yourself / your project (either on your own site, or in comments here).
* Some Simple UI features communicate what your project does better than verbal explanations (e.g. for a search engine, help text that shows example searches for different features)
* Any articles you write you can re-purpose in emails you send out, or vice-versa, so the time you spent doesn't get wasted if one approach doesn't work
* There is a compelling psychological benefit to posting a project on reddit (etc) in comments - every time I do, I think of some minor way I could improve the project. This is a bit like code reviews, where the pressure of showing someone your work makes you do a better job.
* Broadening the scope of what you can do gives you a lot more to talk about publicly. E.g. you might not be an expert in AI, but if you do a couple experiments on a dataset you have, you can participate in all those forum threads.
See also: https://www.findlectures.com/articles/2016/12/19/FindLecture...
This isn't something I would have been able to do if I were still employed, which I assume is your situation since you refer to it as "something on the side." For instance, even getting on the phone with people can be tough, since the hours they're more likely to chat with you are the hours you're at work.
I know this isn't something you want to hear. The good news is that I'm sure it depends on the industry - we had zero connections and background in our industry when we started - and I'm sure our experience doesn't reflect _all_ companies. But I admittedly underestimated how much time/effort needed to go into selling a b2b product when I was a comfortably employed developer.
Edit: re-reading your post, I think you might be describing a consumer-facing product. In which case user acquisition is different, but I would say the challenges are the same (having built many consumer-facing side projects in the past).
Your marketing plan might simply be:
Produce content in various formats for $market. Put call to action on content to urge $market to buy/subscribe/whatever. Then post the content in $community.
The content strategy might be something like:
I will focus on $subject. Will produce blog posts, vlogs, podcasts, whatever. The main subject revolves around it. I will do this three times a week for twelve weeks and measure which content got the most attention.
Its hard to say $advice will work for you because there are many variables. Feel free to ping me (email on profile) if you have more questions.
Also works well for ourselves: https://www.stomt.com/stomt
You can think of STOMT as consumer-friendly GitHub Issues.
What we did to build a userbase is to pay a small fee (1,5) to freelancers of our trust who would find possible clients (not random but selected people) and write a personalised message for them that we would send. Whenever someone becomes a client, they get extra money (7).
If you run the numbers, it's just a matter of probability the fact that we make more money from paying them to find people (and knowing that a lot will fail) than from staying with our userbase without growing.
So far, it's been a good method.
another great book Traction: How Any Startup Can Achieve Explosive Customer Growth co-authored by the founder of Duck Duck Go gives some really great advice on exploring channels through experiments in parallel to your development effort.
You could also try something like betalist to get some initial users.
A simple answer is to keep doing what you did to get your initial users, until that thing doesn't work anymore.
The OMSCS FAQ is vague about whether such a degree is required:
> "significant professional or other work experience with supporting recommendations may qualify as an adequate substitute for the appropriate academic credentials, however work experience will not take the place of an undergraduate degree."
For those that need some background in Computer Science (say you have a B.S. in something else but want to learn Comp Sci fundamentals) there's also the programming certificate course: https://engineeringonline.ncsu.edu/PS/CPC.html
- Hosting: Heroku - Language: Ruby - Framework: Rails - Database: Postgres - Background jobs: Redis/Sidekiq - Transactional email: SendGrid - Logging: Papertrail - Monitoring: Raygun - Subscriptions: Stripe - Mailing list: MailChimp - Blog: Medium/GitHub pages - Project management: GitHub
It's done ok so far, and I'm planning a more formal launch very shortly pending feedback from beta users!
Things are going okay so far...got about 30 beta signups and now moving into open for public use. Working on getting my first 10 customers.
Right now software engineers with AI and Deep Learning experience or Big Data experience are in demand and they can easily clear 200k.
Outside of the US a base salary of 200k less common, but still possible for senior software engineer type roles, or more commonly for CTO or Director of Engineering level roles.
The problem is that housing so much expensive there that it's not clear it's actually worth it.
To put it another way, salary isn't the important thing. It's salary minus expenses, adjusted for local cost of living (really just another form of expenses). While maximizing income is good, cutting your expenses is far more useful (and easier) once your income is high enough: https://codewithoutrules.com/2016/08/08/living-below-your-me...
You can't ignore stocks because they will often cap your base salary and pay the rest in stocks. For example, a VP at one of these may have their annual compensation at $X,XXX,XXX per year but only receive $1XX,XXX in base salary. This is true for developers as well, but the ratio of base to total compensation is skewed more towards base compared to a VP.
Also note that there are some very distinguished engineers at these companies whose role isn't people or business manager who would receive as much as, and sometimes more than, a highly compensated VP.
Obviously market demand does influence the salary, but there are many fields in software development where top skill will command this wage. Generally though, you have to really love what you specialize in to develop the kind of skill and expertise that will earn you this salary, it is not something you do by rote.
Though, at that level it is extremely competitive, and you will be working on solving some extremely challenging problems that you would never encounter outside the government contracting industry.
You can also work for high end service agencies, or startups, or if you want to make way more then that financial institutions would be a good start. Though note, the pace is very fast in many of those companies and the hours may not be worth the large sums of money you will get paid for putting them in if you cannot handle stress very well.
Experience is necessary for that base, but not sufficient though. Have you built a good product? Are you a top notch engineer? Can you pass a facebook/google type interview? If yes, you can demand. In the worst case, you can get a fat RSU package, and a fat sign on bonus, even if you are offered $170K base.
10 years experience.Cloud / Security background.Finance Infra job.
200k$ base salary
50k$ performance bonus
1% ISOs (after considering dilutions. Company is ~1y post Series B)
$200k RSUs on signing, with the expectation of yearly top-ups. Not sure what the cash bonus will be, haven't been here long enough to find out.
This means, you should not try to push the language yourself in anyway. Do the most straightforward, traditional things. Use a well tested framework (if you are doing web). Something like Symfony would do. Don't make your own 'deep' abstractions. The language is not strong enough to support them without a million unit tests to go with it.
Then you should have awareness of the most prominent of the Php pitfalls. /r/lolphp is a good resource for that. Go through the posts and read anything with more than a dozen upvotes.
Then, regarding security and other general topics, don't count on the Php community to answer your questions. I mean, don't take your questions to /r/php but /r/askprogramming or some general forums.
Trust only extreamly popular libraries that have in in use for long time. For example, Symfony components.
Two things you might want to take a look into is specifically Dependency Injection and the Composer dependency manager and how autoloading classes based on their fully qualified name (\Vendor\Package\Classname)
One unique thing about becoming a PHP expert is the contempt you'll occasionally run into from others in the technology world.
Remember engineers get paid to solve problems for the business and success has very little to do with what the current flavour of "cool" is.
Coding knowledge: html/css/es6/typescript/angular
If you want good performance & a huge support base, React Native is probably the way to go. Learning curve is probably a bit higher than Ionic/Cordova (you will deal with platform specific syntax for components), but its what many top companies (AirBnB, Instagram, FB) use for their mobile apps. It is really performant. You may need to write platform specific code and it may take slightly more time, but I still would prefer this route over the hybrid app route.
Coding knowledge: need to know html/css/es6 & have experience with frontend frameworks. Redux/Flux has a bit of a learning curve.
TL;DR: Try doing tutorials for both, and see which one you prefer. IMO it's probably not as fast to develop for React Native as it is Ionic/Cordova, but its still the far better option. It's worth the effort to go down the React Native route.
There's an example program on the front page to judge for yourself how much knowledge is required which is basically just an understanding of the scheme r5 spec. https://www.gnu.org/software/guile/learn/
If you're older and/or have a family then no freaking way. Adjusted for cost of living the Bay Area salries are lower than many places. Apparently Minneapolis and Atlanta pay Software Engineers the most money if you adjust for cost of living. I just moved away to the Midwest and I kept my salary (the company hiring me considered it a "raise" and they weren't wrong). Adjusted for cost of living I would be making over 250k in the Bay Area (according to Pay Scale's COLA calculator).
I often hear folks from the Bay Area say the rest of the country doesn't pay well, but from conversations I've had with other professionals I have had in my town and a perusal of Glassdoor tells a different story it's not hard to make 140k+ where I live.
Companies in the Midwest and Southeast know they are competing for talent with the Coastal centers and they have started to pony up.
You can't look at absolute dollars. If you make ~120k in the Bay you have to realize that's like making 75k every where else.
I don't know if it's worthwhile to go to the bay for purely financial reasons, but it definitely still seems like a good place to go for career reasons.
I'm sort of expecting to move back to the bay eventually, I'm just hoping that they get their head out of their ass and build some more housing.
Assuming all other factors are equal that means you need to save almost twice as much for a down payment in these areas. If you are making >100k/year CA income tax will further complicate matters.
Seattle home prices are about 1/2 SF. There is no state income tax, so add on 8% to your income. Salaries are slightly lower, but not by much.
If you don't care about culture and just want to make/save lots of money, this is the place to be.
I'd throw LA into the mix too, as it has a growing tech scene and a lot of things going for it. Seattle, Austin, and maybe Boulder if you can survive the cold.
I found a very nice studio in Marina (pacific heights) for 2.5k, and it was pretty much first place I applied to, so finding place at least for me was super easy.
Then evaluate your offer and calculate net savings in Bay Area.
For many (especially those currently located in low-paying areas such as Eastern Europe or some Asian countries) the net savings are greater with all things considered, therefore a move makes sense. For others the increase is marginal or non-existent, as high salaries exist elsewhere in the world, so they won't bother.
I used to pay $500 for a huge room in a flat shared with 2 other people :)
2. Reach out to as many people as possible, preferably people outside the company. Most people from the company won't help you and even if they did, they just remind you of the company again, what happened and this brings you again to a bad state and you need to start at zero and reframe again. Just let them go, all of them, really. So, look for prior peers, old friends. Further, write applications or just plain emails to many CEOs and tell them that you are out. You don't have to write that you look for a job. Just get into conversations with as many people as possible. It's more about staying connected and keeping a social context (after you lost the one of the company) than finding the next job.
3. Work on a pet project with a technology you always wanted to work with, get into flow and put it online. This will be the most fun and will give you tons of self-confidence in a very short time.
You should spend 30% of your day on 2 and 70% on 3 and 0% on thinking about the past.
Polish your resume on the plane.
Don't cave to the temptation of making an ass of yourself. You never know when you might run into someone in a future job.
They'll likely make you sign some papers for the 1 month severance. Pay attention. Sometimes there are unsavory clauses, like non-competes, non-disclosure, etc. It would be helpful to know where you are located. If you're in California, for example, you can sign a non-compete without reservation, as they are largely unenforceable.
>any advice from people
Was it a really large layoff? Sometimes, there's opportunity there. Often, some of the key people already smell blood in the water, and are thinking of either jumping ship to a competitor, or even starting up their own competitor. If you know any of the key folks that might b e planning this sort of thing, invite them out to lunch a week or two after the layoff and probe around a bit...you might find a place to land.
Examples: create things (write, program, compose); exercise; meditate; start learning something.
Sleep 8 hours every day. Or whatever is your optimum. But no more and no less.
https://www.amazon.com/War-Art-Through-Creative-Battles/dp/1... -- this book might resonate especially well now.
They make you sign a paper that says you resigned, so you can't claim unemployment, but the severance sounds better than unemployment since you were leaving anyway. Negotiate that severance, too...they offered me 4 weeks at first but I asked for 2 more and got it.
Be sure to get lots of exercise and sunlight. I'm serious you have be very careful about slipping into depression.
1 month for each year served is fairly normal so again, nothing untoward.
Signing a release is also fairly standard. Under these circumstances I would always recommend showing the release to an employment lawyer. For me, peace of mind is worth a couple of hundred dollars but YMMV.
Also, in the UK at least, there are tax breaks on some of the redundancy package so it's worth looking into.
Otherwise, what you do next depends a lot on what your financial situation is. I was made redundant a number of years ago and it worked out great. I was married and had a child at the time but we had enough money for me not to work for a few months. I had a bit of a break, in hindsight I was quite burned out, then got a job at a startup, refreshed and raring to go.
Obviously, it's not always a positive experience but it's not always negative either.
Good luck. Hope things work out.
From looking at people's LinkedIn profile, everyone from developers, to managers, to the L1, and L2 tech support staff had better jobs within a month. Once recruiters got a whiff of the company being in trouble, they started contacting people. Don't ignore recruiters. I have 15 recruiting contacts from different companies in my contact list.
I put "laid off" in quotes above because immediately after I was laid off, I did contracting work for one of my company's clients (based on a written agreement they had with the acquiring company). After that contract was over, I spent a day contacting every recruiting company I knew. Three days later, I had a phone screen with a Fortune 10 company, one day after that I had an in person interview. By that evening I had an offer letter. At the time, I was a an experienced developer but a middling .Net developer trying to get into full stack development.
Moral of the story, aggressively reach out to people, recruiters aren't evil, study up on interview prep, and don't be afraid to take chances on going after jobs that you might feel that you are not 100% qualified for. I've conducted about a dozen interviews over the past four years. I don't care if you meet all of the bullet points. I care if you are "smart and gets stuff done." And if you are an aggressive learner.
The release you've signed is pretty normal, nothing to really worry about (Unless they've done anything illegal, in which case you're not obliged to adhere to the release but I don't think that's the case).
Just get back on the horse. This happens to the best of us.
A couple of years back I resigned from a job in the UK and although I was on good terms with the people I worked with the HR department (inevitably) did their best to try and screw me and having a good lawyer on my side made the process fairly painless as they actually did the negotiation with my former employer and I got 3 months salary and various other benefits.
I was laid off last April and my employer gave me a severance package in exchange for a similar confidentiality agreement.
It took me several months but I was able to secure a new job with better benefits but with a lower salary.
Update your profile on LinkedIn. Update your rsum.
Talk to lots of recruiters. If you have friends in the industry, ask them if their companies are hiring.
Just keep pounding away at it and you'll find the right spot.
Make sure that you sign up for unemployment compensation immediately--sign up before you need it. If you're in the US, there's (often?) a waiting-week period you won't be compensated for; if you sign up immediately, you can get that out of the way first thing. Good luck!
One thing that really helps to keep me sane during tough times is to catalog every teeny tiny expense I've made over the past year. When you know exactly where your money is going, it will help alleviate lots of stress.
Before I did this, I felt a vague sense of panic. After I did it, I realized that I had already earned two times more than what I typically spend in a year. It gave me a sense of calm, knowing that I had plenty of "runway" before having to dip into my investments.
If you have any egregious expenses (I know I did), now is the time to systematically eliminate them. You might be money poor, but you are time rich now. If you treat your life like a business, now is the time to make some big cuts to ensure your longterm survival.
Just last month, I cut my phone bill in half, figured out how to cut food expenses by a few thousand a year, and reversed a bunch of b.s. charges for services I no longer use.
Make this your new job & you will thrive.
Welcome to the next chapter of your life, cheers!
Happy? You should be ecstatic. You just won the lottery!
What you would have received if you had quit at 3pm: nothing.
What you will receive because they beat you to it: 4 weeks pay, 5 weeks benefits, 26 weeks (potentially) unemployment. I dunno, something like $10,000 to $20,000.
Count you lucky stars and enjoy your lottery winnings. I wish I could figure out how to do that.
It was written by a fellow HNer a few years ago, but still relevant today, IMHO.
Edit: shortened overlong sentence.
That said, I like the question, I have never been laid off or terminated, I've resigned from all 4 jobs I've had (employed at the 5th) and so I'm reading other answers to see if there are real issues to be aware of should it happen to me.
It's great that you were thinking of leaving anyway. Rejoice that you get the benefits for slightly longer than you would anyway, and move on.
I was very lucky in that another division in the same company was having a different re-org. and a few jobs opened up, so I applied for, and got another job. Same company, different business unit. Less than ideal, but I count myself lucky. (Although jobs are posted out there, its extremely rare that companies hire or conduct interviews during the holidays!) But the feeling of having been laid off was quite devastating; again especially since I had never gone through something like that.
I think the advice that others have been offering seems pretty good. While my lay off period was extremely short, I myself woke up every morning - as if at any other regular job - and kept searching/applying for jobs. I think that "routine" helped me deal with the whole thing at least emotionally. I also like some advice throughout the comments here about working on a side project. That could help in several ways:
* Keep your mind off the challenges (physical, social, emotional, etc.) associated with finding new employment.
* Maybe it could turn into a little revenue on the side to supplement unemployment, etc.
* Possibly, it could turn into an opportunity to go into business for yourself. Even if it doesn't make you a millionaire, or is short-lived, its still work. Maybe it might pay bills, and you can feel good about putting it on your resume/linkedIn, etc. (In the state of NJ, you are allowed to collect unemployment and still have a part-time side business ...But there are caveats and of course I'll disclaimer that I am not a lawyer. So you'll want to seek out professional legal advice if you're considering this.)
* Even if the side project results in no new business, you will have picked up some new skills, or perhaps improved any existing skills. And, if it involves other people - like a meetup - maybe you can get some future business/opportunity contacts - i.e. networking!
The only other advice I can give you: stay positive, and keep yourself busy so as to avoid getting into a negative groove. Good luck!!!
 See "Part-Time Corporate Officer/Owner" section on http://lwd.dol.state.nj.us/labor/ui/aftrfile/corporate.html
Last night I was reading a Brazilian article, based on a study, about how (what the author called) "centrality" plays a large part in the success of a neighborhood. "The concept applies to places with high concentration of economic activity, intense circulation of people and a large diversity of services." In short, it seems living where you work makes for a nice neighborhood.
Entrepreneurs, VCs, governments
Corporations focus on the decade. But the focus on the quarter part is what is made public.
Disclaimers abound: Obviously not all corporations. Some are good, some suck. Some are very public with their long term plans/thoughts, some are very secretive about R&D and their thinking beyond the fiscal year. There are groups within corporations (some with billion dollar budgets) focused on the 5-15 years out period. There are many corporate consulting firms specializing in exactly this 5-15 years out period too.
Right or wrong, this ~10 year secular horizon is also sweet spot where secrecy about it does have value if you want a return on investing in it.
In order to achieve anything non-trivial, you need to aim a step above. You need a direction, a vision that's bigger than what can be achieved in the short/medium term.
My skill as an idealist/thinker/designer is to come up with pure, abstract, and consistent models. I try not to consider reality (the present) in order to keep my models pure. I try not to consider implementation details as this will introduce exceptions and inconsistencies that will weaken the model and dilute the vision. I come up with the what, not the how. Anyone who doesn't strictly adhere to these methods will ultimately produce mediocre and short-sighted models. Sadly, it seems like those people are often the ones whose models are adopted.
We don't really care about living to see those visions become reality. We are selfless and do this out of moral duty. Even if things improve, we will inevitably remain unsatisfied with reality as we discover additional problems. We care about the process, not the result.
The one thing we feel an urge to fix, is your ignorance. There is nothing worse than witnessing people being content with the way things are.
One awesome thing my work did for me was brought in a hand massage specialist who taught me several stretching techniques for the hand that help increase blood flow which in turn helps keep them much warmer.
Check out the the following page , it has pictures and descriptions that teach great stretches. Not only is it good for circulation it's good to just do this in general to prevent other common problems that stem from lack of stretching.
side note stretching has been a real game changer for my programming. Not only does it make me feel more energized, the stretching seems to have increased my work ethics by a lot because I feel more energized to be that team player.
If this doesn't help just grab a desk USB hand warmer and that should be able to help when your hands aren't feeling so nice (as mentioned by other users in this).
edit Also wanted to mention after thinking a bit more and the hands, feet, and head are the places you lose the most amount of body heat from. I wear a hat while programming so possibly having one at your desk may also help keep in more heat? Just a thought, doubtful this is the root of the issue for ya though.
Obviously I am not a doctor.
Reading through that suggests either you are a normal case and just need to take your fitness seriously (including keeping stress under control) to improve circulation. You could be an abnormal case and need to look at medication - but as you have already seen a doctor I am going to guess that isn't the case.
For fitness I wholeheartedly recommend https://www.reddit.com/r/bodyweightfitness/wiki/kb/recommend... (vid: https://www.youtube.com/watch?v=AB3HhP2GYk0&feature=youtu.be ).
The heater suggestions seem like good ideas to treat the symptoms while you work on the cause.
Reporting it to your manager is an interesting question. Personally I wouldn't do anything formal, but I work quite closely with my manager so he would informally know, I also don't have to get permission to use any personal equipment at work - which isn't the case for everyone.
But again, I am not a doctor.
It sounds like a PITA of a condition. I hope it is benign and treatable for you.
Of course, this only works if blood can circulate heat from your core to your extremities. Try throwing on a vest and, when coding, make sure your elbows are not bent and your writs are not resting on a pad in such a way as to obstruct blood flow.
But this was before USB, you know, when you had to go uphill in the snow both to and from school.Nowadays you can get something like:
And of course, you should be careful in your choice of computing hardware and software. Nowadays, hardware and software are optimised to spare energy usage, processors go to sleep or reduce frequency while you're working, etc. All this doesn't produce much heat, in top-notch computing hardware. Instead, choose cheaper, less "green" hardware, some laptop that heats a lot, and run some background tasks (eg. you may compile the linux kernel in a loop, or have some 3D rendering game running in background), so that the processor is used close to 100% full frequency, and produce more heath. Then you can put your fingers on the hot surfaces or on the air vent exits.
In your circumstance, I'd look into USB-powered heated gloves as an option as well, e.g. . If that alone isn't sufficient, some have removable heating elements that you could probably transfer over to the heavier fingerless gloves mentioned above.
Check the lifestyle and home remedy part for some advice, but it sounds like you just need to plan more breaks and relax your extremities more.
So I'd continue to be checked. There is likely a more specific underlying cause that can be treated. Cold is a factor but it seems based on the condition that you could be coding in a volcano and still have this happen
Edit cause I bumped submit on tablet too soon.
A good short term solution is to fill a paper cup with hot water and wrap your hands around that. This provides temporary relief but only treats the symptom. The effect wears off quickly.
I have also tried fingerless gloves, but those are completely worthless.
The only real solution is to do some light exercise. Most days after I eat lunch, I will walk around for 30 minutes. This light exercise creates heat in my muscles and thereby heats up my blood. The warm blood can also freely circulate to my hands and feet as nothing is constraining the flow of blood. After about 15 minutes of walking I can feel an internal warmth returning to my hands. The skin is still cold but I know soon enough my hands will be warm again. And the effect lasts the rest of the day.
I have the small rooms one described here. And it is pretty manageable. http://thesweethome.com/reviews/best-space-heaters/
The US Army has done some research suggesting you can train away the response by (IIRC) keeping your hands in warm water while cooling your body:
I've tried this with good results but it may not work aswell if you have the issue in warm temperatures.
There are also heated keyboards and mice you could try.
Lots of unhelpful advice in other posts: gloves don't work, because heat is brought to your hands by blood flow. Blood flow is cut off, which is why they are cold in the first place. Exercise doesn't really help, because it elevates your core temperature which your body dissipates by circulating to your limbs... which isn't happening. People won't understand what it's like to be painfully cold in a perfectly normal room.
For immediate fixes: if your skin goes dead white and you lose feeling, immediately do something to warm it up.
Finding a bathroom and running warm water over my hands often fixes it, and certainly feels better - though it can be painful as the numbness wears off. You need an external heat source because your body can't do it on its own.
If your flesh goes blueish-purple, warm it IMMEDIATELY. Extended periods without blood will kill cells and you'll get the equivalent of frostbite and gangrene.
In the long term: It's a spasmodic overreaction to cold, so avoid cold sources. i.e. it can be triggered by air conditioning blowing on you, holding food from the freezer, and so on. I wear a hat into our server room at work for just this reason.
Stress level is related, so exercise may help ... indirectly. I've lost 40 pounds over the past year and a half and walk several miles a day. It has been good for my physical condition and stress, but it doesn't seem to have helped Reynaud's.
It can help to have significantly warm clothing to keep it from triggering; I wear Minus33 undershirts and they help. My wife found a woman who had Reynaud Syndrome who makes her own wool mittens to help, and bought me a pair. (I feel like I have giant fuzzy flippers, but they work.)
I have not tried medication for it; can't tell you if it's worth it.
On the plus side, if you don't like feeling too warm... it may never happen to you again. I felt overheated exactly once this past summer, and my house did not have air conditioning.
I'm sure if you talk to your manager and explain that you have a legitimate medical concern that they will help reach a solution.
She found the rechargeable electric gloves from Columbia to be very useful. Many outdoor equipment/apparel companies are manufacturing similar items now. Perhaps a fingerless pair of gloves would help?
edit: perhaps, something like this:www.heatedmouse.com/Heated-Gloves.html
It sounds like room temperature doesn't impact you you, Filthy_casual, much, so I'm not sure how much this will help you. I am posting mainly for others that may be curious.
I've built these tents out of a number of things, but most commonly it's a t-shirt with 2 coffee mugs on either side to prop it a little. Janky? yes. Effective for me? yes.
I dislike typing with gloves, as my accuracy drops quite a bit. Fingerless gloves don't keep my hands warm. I dislike heating the air in a large room to heat my hands, and I have annoying preference for symmetry on my body that is hard to achieve without two heaters.
Err, maybe I'm missing something, but how about investing in a BETTER pair of gloves?
Doing something with your fingers while walking (keeping them occupied, e.g. with small stretching, etc) will help the blood flow better.
Also, maybe don't go out for "long walks" when it's too cold outside?
Anyways, my fix is to get the heart rate up. I jump on the treadmill at an incline and do some push-ups. 10 minutes is all I need. And no, I'm not a fitness freak.
I wear a hat.
I wear enough clothes to keep my core warm.
When I get up to use the bathroom I also go sit in front of the wood stove for a few minutes and warm my hands up.
The founder's strategy was to hang french fry heating lamps from the ceiling, just a little over our hands. It worked great!
Anyway, I'd personally try niacin (also known as vitamin B3), which is also used in heat-rub creams.
Probably not as good as fingertip-less gloves but close enough for me.
All joking aside, I have the opposite problem. I'm always hot.
Airconditioning, open windows, or bad isolation can cause an un undesired airflow.
> The doctor told me that it's called Raynaud's phenomenon and that I'll have to figure out ways to deal with it.
Wait, your doctor did not tell you how to deal with this? You're not paying anyone here for medical advice.
For people who work behind a desk for 8 hours a day, 5 days a week I recommend the following:
First of all, regular physical exercise. Its obvious but it has to be stated, and its even more so important if you don't do physical labour.
Second, for office work the following advice (in no particular order: based on own experience, pomodoro techninque, plus local laws concerning this type of work): put an alarm on your smartphone or watch or equivalent device, set it to one hour. Every time the alarm goes off, you take a walk and do some stretches, total of min 3 up to 5 min (more will cause drama with coworkers and/or boss). If someone complains, you tell them that smokers get to smoke in the bosses time (thereby having a walk, good for their blood circulation; smoking itself obviously isn't good for blood circulation and if you do quit ASAP; consult your M.D. for aid) and you need a small walk to keep your blood circulation going. (Of course, you could also try to plan meetings or grabbing a coffee together with your walk & stretch, tho I don't recommend 6+ coffee during 8 hours of work.) During this downtime, you can think of whatever comes up in your mind. It is actually rather likely that more often than not you get inspiration during your downtime, but that is a useful byproduct not the main goal (this is called the diffused mode of thinking). Oh, and if someone laughs at you, know that when you're both elder you're the one who's laughing because you cared about your physical health throughout your working career. I mentioned this is partly based on pomodoro technique. Its a variation on it. If you're self employed, I actually recommend the pomodoro technique itself (ie. traditional pomodoro is 25 minutes of focus, with a 5 min break, and after 2 hours, a longer break (there are variations, worth looking into this further)). But if you're working for a boss or in a team then a small break after 25 minutes of focus is frowned upon. I believe its a productivity loss, but this is the way the status quo of work force generally thinks, sadly. There's some excellent pomodoro apps available for macOS, Android, iOS and surely also for other OSes and platforms. Like I said, alarm apps also work.
> What do we think about this protocol?
It's the first encryption protocol that allowed me to actually use it on a daily basis. I regularly use my desktop client and my mobile client in parallel and switch between them constantly. OMEMO allows me to do that.
> Is it a good idea?
Yes. Compared to OTR the entire stack (that includes the XMPP layer) is properly standardized. This also kinda answers your questions regarding the OTR implementations. OTR had the problem that it couldn't do multiple devices and the behavior regarding multiple devices and when to start and end sessions wasn't defined at all.All OMEMO developers are also in regular contact to coordinate behavior between the apps.
> Why are there three encryption choicesI would really like to get rid of OTR (and we will eventually) but we currently still need it for backwards compatibility with older clients (primarily Pidgin)PGP servers a bit of a different use case. It doesn't provide forward secrecy and authentication but it turn allows for a server-side re-retrievable archive. If you get a new client it can automatically retrieve old messages. (In OMEMO the receiving must exist at the time of writing. It doesn't have to be online but it has to exist and announced the device specific key material)
In reality the choice isn't too much of a problem. You select it once per contact and that's it. It's not like you are getting new contacts every day.
> How is the server support.
The server requirements for OMEMO aren't too bad. However it is recommended that you do pick a modern XMPP server for other reasons (battery-friendliness, reliability). Have a look at this comparison list to see if your server supports all modern extensions: https://gultsch.de/compliance_ranked.html
> How is the support of group chat
Support for group chat exists and works fine once it is setup. However it has some limitations that make setup harder. Everyone has to be in everyone elses contact list. And the group needs to be setup with special parameters. (Conversations automatically sets it up this way, but you couldn't for example create the group with Pidgin and then expect OMEMO to work.)The readme on the Conversations github page explains this in a little more detail: https://github.com/siacs/Conversations/blob/master/README.md...