Coding

coding java programming

How is competitive programming different from real-life programming?

Adapted from Anthony Moh:

In competitive programming, you just have to choose the first algorithm that comes to mind that you think will work and then code it. The aim while coding is to just get it down and make minimal mistakes. You do not have to worry about maintenance  documenting etc. No need to to think much about how to name the variables, split the code into functions and so on. Also, competitive coding is short. You will not have to spend more than a few days on it. And most of your time is spent coding.

While competitive programming gives you important knowledge of algorithms and how to implement them, you will find that in most jobs, coders just use libraries of algorithms. So, the most useful part of competitive coding is learning which algorithm to use for the problem at hand. At office, you will spend only a small amount of your time writing code. Most of your time is spent in deciding what to code, testing, documenting and …

You are in thprogramming bug jokee jungle. You have a pocket-knife. Someone asks you to kill a mountain lion. Anyone but a programmer would be asking “WTF is a MOUNTAIN lion doing in a JUNGLE?!”, but that’s not what you have been trained to do as a programmer. You are here to solve problems, not to question them.

Years of training has taught you well. You use your knife to sharpen a stick. You cut vines to lash sharp stones on one end. Maybe you’re from a top university, and you’ve learned to extract essential ingredients from plant and insect life around you to fashion a poison to tip your weapon with.

Convinced that you have an effective and efficient way to kill the lion, you set forth to accomplish your task. Maybe your stick is too short, or your poisons don’t work. It’s okay – you live to refine your method and try again another day.

Then someone figures out a way to fashion a low-grade explosive from harvesting chemicals in the jungle. Your method of fashioning a spear to kill the lion is now far from the best way to accomplish your task. Nevertheless, it’s still a simple way, and will continue to be taught in schools. Every lion-killer will be taught how to build his tools from scratch.

That’s “real-life” programming.

In competitive programming, you start out with the same resources (a pocket-knife), except you have 2 minutes to kill the lion.

As a beginner, you will stare at the lion and do nothing.

Soon, you learn that if you kill a squirrel, sometimes the judge thinks it’s a lion and you’re good to go.

A more experienced programmer just keeps stabbing the lion and hopes that the lion dies in time. Soon, you learn that there are certain spots on a lion that are damage immune. You learn to not even bother stabbing those spots. Sometimes, the lion doesn’t expose those spots, so you get really good at killing squirrels. (more…)

beginner programming or coding

What are the best ways for a complete beginner to learn programming?

Adapted from Roshan Choxi, Cofounder and CEO of Bloc

It’s been my sole focus to answer this question for the last two years, and I think a lot of the resources mentioned here are great but I’ve noticed there are three strategies that successful students consistently use better than anyone else regardless of what resources they use:

1. Focus on habits, not goals
2. Learning alone is painful
3. Build things (more…)

coding java programming

How do you keep your programming skills sharp?

Short answer: ABC: Always Be Coding.

1. The more you code, the better you’ll get — it’s that simple. By coding, you’re practicing. But the best practice is focused practice. Have goals in mind, explore new areas, and challenge yourself. Over time, you should develop a portfolio of both unfinished and finished projects. GitHub is a great place to put this portfolio on display, but just having an eclectic body of work is huge.

2. Re-build the wheel. You should implement the most common data structures in the language you’re trying to learn. Do not rely on common libraries. Implement the following and write tests for them: vector (dynamic array), linked list, stack, queue, circular queue, hash map, set, priority queue, binary search tree, etc. You should be able to implement them quickly as you get more comfortable with the language. (more…)

python script logo

What are the main weaknesses of Python as a programming language?

Answer by Jesse Tov:

The essence of my complaints with Python boils down to two things:

  • Much of the language consists of special cases rather than general features that combine in orthogonal ways. This results in infelicities and weird corner cases.
  • Guido van Rossum has a history of getting the language design really wrong (e.g., http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html), which means that we might expect him to continue to get things wrong in the future.

Some examples:

  • Python has perpetual scope confusion. As far as I can tell, this is because van Rossum didn’t understand lexical scope initially, so he got it wrong. (This isn’t a problem unique to Python. It seems pretty common among early versions of scripting languages.) Originally, Python was dynamically scoped, which everyone but RMS agrees is wrong. Then they did away with the dynamic scope, but made it so that inner scopes couldn’t even see variables from outer scopes, which is bizarre in a supposedly block-structured language. Now inner scopes can see outer scopes but can’t mutate them, which is bizarre in a supposedly object-oriented language. Some may claim this is a feature, but it’s an accident of implementation. I’m sure when he fixes that, he’ll break something else.
  • David Parnas invented information hiding more than three decades ago, but it’s “unPythonic,” so Python is missing probably the biggest advance in programming since FORTRAN 2.
  • eval

    breaks alpha-equivalence — that is, you can’t arbitrarily change the names of variables, because some variable occurrences can hide in strings, which makes the binding structure of Python undecidable.

  • Python is untyped, which means that a whole bunch of errors that are easily detected ahead of time aren’t detected in Python until they happen. Some people like it that way — and more power to them! — but it’s always worth considering whether it’s a misfeature for your particular application
  • Syntactic whitespace can be nice, but it makes code generation harder than it has to be. This isn’t a difficult problem to solve. Haskell lets you use either syntactic whitespace or an equivalent syntax involving curly braces and semicolons. One is good for people and the other for metaprogramming, and there’s no good reason not to support both. It doesn’t help that when people have requested this, Python’s implementors have been really snotty about it. (Try
    from 
    __future__ 
    import 
    braces

    .)

  • Limiting the bodies of
    lambda

    s to be expressions rather than statements is arbitrary and annoying. That variable declarations and assignments are statements rather than expressions is arbitrary and annoying. The statement/expression distinction is arbitrary and annoying.

  • “The [hash table] is a stark data structure.” Python, like the other table-based languages, encourages you to use “mappings” for many things where sum-of-products (algebraic) datatypes would be more appropriate. This is inefficient, but more importantly, it’s error-prone. To continue quoting Perlis, “Programmers are not to be measured by their ingenuity and their logic but by the completeness of their case analysis.” Python’s lack of support for appropriate data structures encourages program structure that hides case analysis.

All that said, I’d still rather work with Python than PHP or C++. But that’s like saying I’d rather eat Jack in the Box than McDonald’s. It might be slightly more palatable, but it’s still pretty bad.

View Answer on Quora

coding java programming

What are the best resources (sites, books or tutorials) for learning programming?

Answer by Nick Huber:

I’ve been spending 6-8 hours/day teaching myself to program for the past month or so and have basically scoured the Internet for every free or semi-free tutorial out there.

Here’s the good stuff I’ve used and recommend:

  1. CodeHS — Personally graded, video-then-program format problems, starting with a toy language called Karel and moving up to Javascript, culminating in you making the game Breakout in your browser. Founded by two ex-CS106a TAs at Stanford from which the curriculum was largely adapted. They have probably 40 hours of really good content and, most importantly, provide you friendly, one-on-one help with like ~3 hours turnaround when you need it. Check out my version of Breakout I made after doing all of the content: EpicBreakout. (1)
  2. Google’s Python Class — Unlike above, requires some set-up on your machine (i.e. you’re not coding in-browser), but still good. About two days worth of lectures on Python with a handful of good problems, culminating in regular expressions (like a custom CRTL + F in a Word document) and a problem where you descramble an encoded image from a website.
  3. CodingBat — Python and Java problems. No frills, just the exercises — probably better for someone with a little bit of background (meaning you know what a function/parameter is and can use The Google to figure out/find syntax/functions you need). The site was made by the same guy who taught the Google Python Class.
  4. Khan Academy — A few intro tutorials (mostly graphics/animation-focused) in JS using a well-regarded library (Processing.js) and then a wide-open project space for you to see programs other people have made (i.e. the end result and the code) and to make your own, potentially forking off of their work. Here’s a game that some guy made that served as inspiration for my version of Breakout: Mercury Subspace. Pretty great, right?
  5. Codecademy — Solid read-then-write-code format of small problems broken into different subpieces. I used their HTML/CSS tutorials to get a basic background before making my personal website (http://www.thenickhuber.com/) and am going to use their stuff on more advanced JS and jQuery when I get to it. Still, their grader is a bit buggy and there’s a large variance in course quality/overlap in material, since everything is written by different people.
  6. Learn Python The Hard Way — Read-then-implement exercises, starting from no assumed knowledge. Good, but still not as good as interactive problems; I gave up after doing ~20% or so of it because it’s unapologetically repetitive, but have read lots of good reviews of it.

Other good stuff I want to check out:

  1. Stanford iPhone course (all slides and assignments: http://www.stanford.edu/class/cs…) — an iPhone app seems like such a good early project, because it’s so easy to show your friends what you’ve made, but have to figure out how completeable it would be for me. Also, you can’t get your problem sets graded if you’re just working on your own from the material online.
  2. K&R (http://www.amazon.com/Programmin…) — Highly regarded intro book on C and implementations of the most canonical algorithms. (If you know of a website that tries to do something like this, would love to get it from you.)
  3. The many CS courses on Coursera and Udacity. However, I think it’s really important that you have someone grading your work so that you can get feedback (and that you actually do the problems rather than just watch the lectures). I’m not sure if this is possible if you take the course “off-cycle” and how good the problems are, but still worth taking a look.

After a month, I’ve now got a better idea of what I can make and this then informs things that I think would be cool to make. At this point, I’m most excited about continuing with this project-based learning approach as I think it’s more effective/lasting/fun than more tutorials/classes, but it’s still tough to get this outside of the university/work environment.

View Answer on Quora

python script logo

What are the best Python scripts you’ve ever written?

Answer by Akshit Khurana:

Thanking my 500+ friends who wished me on my birthday on Facebook:

It was my 21st birthday and there were three stories that made the day memorable. This was the last one of the day.

I prefer to comment on the wishes individually and personally, but using python to do that was going to be better.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# Thanking everyone who wished me on my birthday
import requests
import json

# Aman's post time
AFTER = 1353233754
TOKEN = ' <insert token here> '

def get_posts():
    """Returns dictionary of id, first names of people who posted on my wall
    between start and end time"""
    query = ("SELECT post_id, actor_id, message FROM stream WHERE "
            "filter_key = 'others' AND source_id = me() AND "
            "created_time > 1353233754 LIMIT 200")

    payload = {'q': query, 'access_token': TOKEN}
    r = requests.get('https://graph.facebook.com/fql', params=payload)
    result = json.loads(r.text)
    return result['data']

def commentall(wallposts):
    """Comments thank you on all posts"""
    #TODO convert to batch request later
    for wallpost in wallposts:

        r = requests.get('https://graph.facebook.com/%s' %
                wallpost['actor_id'])
        url = 'https://graph.facebook.com/%s/comments' % wallpost['post_id']
        user = json.loads(r.text)
        message = 'Thanks %s :)' % user['first_name']
        payload = {'access_token': TOKEN, 'message': message}
        s = requests.post(url, data=payload)

        print "Wall post %s done" % wallpost['post_id']

if __name__ == '__main__':
    commentall(get_posts())

To make this work, you need a token which you can obtain from Graph API Explorer with the appropriate permissions. The script assumes all posts after certain timestamp are birthday wishes.

With a small change in the comments function, I also liked each post.

The screen after I ran the script:

(This screenshot makes things look much cooler than they are.)

Watching the ticker go boom with my likes and comments and the structure of the comments, Shashwat Lal Das | Facebook quickly identified I had done something like this.

Probably not my best python script but this was simple, quick and fun!

The idea came up in a discussion with Sandesh Agrawal in Networks Lab. Thanks for not working on the lab assignments and wasting time with me!

View Answer on Quora

Wikipedia Foundation

Are Wikipedia software development engineers of the caliber that could work as SDEs at Google / Facebook / Amazon / etc?

Answer by Brandon Harris, Senior Designer, Wikimedia Foundation:

“OB Disclaimer: I work for the Wikimedia Foundation, so there’s going to be a bit of a “dragonslayer” tone in this answer.

This is a long answer, but I promise you, it pays off.

First, I’ll address your concerns about working with “less talented people”.  There are two things I want to bring up here:

1) I’ve been working in this industry for close to 20 years now.  I’ve worked with brilliant minds and layabout assholes.  Foundation engineers tend to fall closer to the “brilliant” side of that spectrum.  Many of them are younger and inexperienced, but that makes them no less smart.

2) If your deciding factor for working with an employer is based around “being around intelligent people” then I think you’ll be disappointed no matter where you work.  This is because of two things:  a) there will always be people who you think are morons, and b) intelligent people tend to disagree with each other, and that can be a frustration that leads one to think that the other person is a moron. (more…)

Software Engineer

What happens to software engineers who don’t climb the corporate ladder and stay as engineers?

Answer by Harry Glaser:

They become … Unix Beards!

(Just kidding.)

They become better, more experienced, more sought-after, better-rewarded engineers. Some of the best big tech companies recognize this explicitly in their career ladders. At Google, for example, there is a separate job ladder for “individual contributors”, which culminates (or once did) at “Google Fellow”. An engineer at this level is commensurate with a Vice President, and has similar high-level impact — even moreso on questions of technology, architecture and technical direction. I believe there are similar positions at Facebook, Apple, etc. (more…)

whatsapp messenger

How did WhatsApp team go about building app on multiple platforms cheaply?

Answer by Sayo Oladeji:

As much as I agree that scaling the backend is a very challenging thing. Android, S40 and S60 are particularly difficult to program. WP7/8 are relatively easier. There’s a reverse engineered source of the WhatsApp Android client online; take a look at the number of com.whatsapp classes and you’ll get a feel of the enormous work that this guys have done (humorously, this kind of explains why Facebook has never been able to put out a decent Android app).

On the client-side, you have to deal with fragmentation issues as your users won’t be running the same OS version, screen sizes and color depth, hardware, memory, processor, etc. Things even get messier when they’ll have to run your app on tabs. Some devices won’t even allow HTTPS out-of-the-box.

Now take Nokia S40, you have FT (full touch), NT (non touch), TT (touch and type); on S60 you have FT and TT; on Android you have FT, NT, TT (and then you also have tabs to cater for); on BB you also have FT, NT, TT (and you also have the PlayBook tab to cater for), on iOS you are free from fragmentation to an extent but there comes the iPad and then iPad mini which you also have to cater for; its only on Windows Phone that you’re somewhat free from fragmentation since Win Tabs run Win 8 and not WP8. (more…)

coding java programming

How can I get better at handling edge cases in computer programming?

Answer by Adam D’Angelo (Quora, Founder and CEO):

Overall, you have to get into the mindset of thinking like an adversary who is trying to cause your code to fail. Whenever you decide to get the first element in a list, you need to automatically think “could the list be empty?”. Whenever you start or finish writing a while loop, you need to think “is there any way this could possibly be an infinite loop?” To a large extent you’ll get this with experience, but there are some ways you can make sure you build up that experience more quickly.

One thing you can do to start is to use assertions and other techniques to “fail fast”. This will make sure that edge cases that you have forgotten about will show up as errors that get your attention during testing, rather than silently surviving as bugs. For example, at the top of a function that reverses a list, you might want to assert that the variable is actually a list. That way, if there’s an edge case somewhere else that results in the reverse function being called with null as an argument, you’ll detect it more quickly.

Writing unit tests can also be pretty helpful, and they also help you change your mindset toward testing and edge cases.

There are certain techniques that make edge cases less likely to occur in the first place. For example, using for loops instead of while loops gives you less flexibility and therefore fewer chances to make a mistake. Writing functional style code (recursively traversing data structures, copying data instead of updating it in place, etc) generally results in fewer edge cases. If you were writing a function to sum up all the numbers in a list, you might want to make it so that it intentionally works for the base case where the list is empty and the result is zero for that case, instead of starting the sum as the first item in the list and adding the rest to it.

If you really want to invest a lot of time in getting better at this in particular, the algorithm competition in Topcoder has a challenge round where you look at other people’s solutions to problems and get points for finding edge cases that break their solutions. Participating in that for a few months made me significantly better at thinking through edge cases.

View Answer on Quora