HN user

irahul

3,322 karma

rahul AT thoughtnirvana DOT com

Posts26
Comments1,072
View on HN
github.com 13y ago

Clojure plugin for vim(omni-complete, repl, eval...)

irahul
2pts0
www.artima.com 13y ago

The Adventures of a Pythonista in Schemeland

irahul
2pts0
news.ycombinator.com 13y ago

Ask HN: How did you learn Scala? And are you finding it useful?

irahul
10pts2
web.archive.org 14y ago

How to say nothing in 500 words

irahul
132pts56
www.eweek.com 14y ago

ITA on Python(2007)

irahul
1pts0
www.forbes.com 14y ago

How One Flawed Study Spawned a Decade of Lies

irahul
1pts0
steve-yegge.blogspot.in 14y ago

The Borderlands Gun Collector's Club

irahul
1pts2
github.com 14y ago

Codemod - Interactive code refactoring

irahul
3pts1
github.com 14y ago

IRB session to existing ruby process.

irahul
73pts21
www.dabeaz.com 14y ago

Python co-routines: follow-up to Python generators presentation [pdf]

irahul
134pts14
github.com 14y ago

Stuck with xml? Why not convert it to Python dicts and vice-versa.

irahul
3pts1
github.com 14y ago

Small functions to functionally augment ruby.

irahul
33pts7
news.ycombinator.com 15y ago

Ask HN: When did fflush got defined for stdin as well?

irahul
1pts2
github.com 15y ago

Contract based programming (Python)

irahul
50pts12
www.stateofcode.com 15y ago

JSIL: Compile .NET to Javascript

irahul
2pts0
news.ycombinator.com 15y ago

Ask HN: What's the Google+ stack?

irahul
54pts18
github.com 15y ago

Love Jinja2 but like Slim templates syntax better? Why not have both?

irahul
3pts1
github.com 15y ago

Python itertools like lib for ruby with fibers and generators.

irahul
2pts0
wordify.me 15y ago

Simplistic messaging site. Trying to cash in on Valentine's Day Rush.

irahul
8pts15
news.ycombinator.com 15y ago

Ask HN: Web framework independent Python libraries useful for web development.

irahul
5pts3
news.ycombinator.com 15y ago

Ask HN: Perl 6 looks interesting. But what's the current status?

irahul
8pts3
news.ycombinator.com 16y ago

Ask HN: Does anybody have any success with NLP sentiment classification?

irahul
1pts2
blog.shopyist.com 16y ago

Follow-up of HN's response to my post

irahul
4pts6
blog.shopyist.com 16y ago

Hello HN: I am taking the plunge. What do you think?

irahul
13pts46
prag-matism.blogspot.com 16y ago

Passwordless scp with python and pexpect

irahul
1pts3
prag-matism.blogspot.com 16y ago

The beauty of node.js

irahul
2pts0

I keep repeating that this is not about SQL injection.

Is that why you made that absurd claim about sql injection being an explicit requirement? And that weird figure of 24 hours for handling sql injection, and api validation?

Never assume a database or any IO call for that matter will always go right.

I said "db calls aren't randomly placed in try/catch - that will be absurd". Because they will be handled at app level to return uniform error messages. Now I am sure you will go on pretending that when you said "db calls aren't in try/catch", what you meant was db calls can throw an exception and app will handle it.

Pretty much any large codebase, that passes objects around should always do Null pointer checks. This is because several times resource heavy objects are initialized only on certain conditions, and if such objects are passed around they must be checked.

What did I say about None checks not necessary because of something which is visible in the code? What do you think those marshmallow schemas and use_kwargs is for?

Welp. This is the point I checkout. You do you, but I have to ask. Do you have any production experience[1] and/or hiring experience? Because you have a very fundamental misunderstanding of both, and I find it very hard to believe that someone who has written even trivial applications would think that not having sql injection is an extra requirement or is going to take too much time, or anyone in hiring position is not going to politely terminate the interview after someone claims their assignment has an sql injection but that's because they didn't have much time and it wasn't explicitly asked for, or even consider calling someone for in-person eval when their assignment has an sql injection.

[1] There is a lot wrong with your "improvements". db calls aren't randomly placed in try/catch - that will be absurd. And the None checks aren't there because of something which you can very clearly see in the sample code but you also very clearly don't understand.

Exactly, if you provide the laundry list its easy to validate your assignment against it.

There is no laundry list. There is an expectation that a senior engineer writes codes like a senior engineer.

You submitted code which doesn't have things in my laundry list. Noticeably your db calls aren't surrounded by try/except. You have written no documentation. You didn't ship the code with git repo. No unit or functional test cases. I also expect these days one would use Python's typing library. Most of this helps in code maintainability. The fact that your assignment has none of this means you can't be hired to write production code ....

Not sure if you are really this dense or playing dense - the point of the comment was to show that your assumption about api validation and sql injection being explicit requirements or taking too much time is ridiculous. It' simple that it can be written in a comment in about 10 minutes, not the "24 hours" or whatever you claim it is going to take.

The very fact that you think sql injection is an explicit requirement or takes work will be an instant deal breaker for any position with the possible exception of fresh grad positions.

... See where this is going?

Yes, I do. You are arguing reductio ad absurdum to hide the fact that the things which you claimed unreasonable are in fact routine, and your time estimates are off by order of 10.

In 24 hours?

No, not in 24 hours. In about 2 hours. The laundry list of things - api validation, error handling, db migrations, good naming - it's pretty routine. A person writing production apis will have no trouble integrating all of it in a very short period of time. This is after all what we do everyday. If a candidate thinks not having sql injection in the code is an explicit requirement or is going to take a lot of time, then that is not the person for the job.

Here is a pretty simple flask implementation of your laundry list - api validation, db migration, no sql injections, no n+1 queries, good naming, swagger ui...

    from flask import Flask, jsonify
    from flask_sqlalchemy import SQLAlchemy
    from flask_migrate import Migrate
    from flask_apispec import use_kwargs, marshal_with, MethodResource, FlaskApiSpec
    from marshmallow import Schema, fields, validate, ValidationError
    from sqlalchemy.orm import joinedload

    # setup

    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///dev.db'
    db = SQLAlchemy(app)
    migrate = Migrate(app, db)
    docs = FlaskApiSpec(app)


    # Return validation errors as JSON
    @app.errorhandler(422)
    @app.errorhandler(400)
    def handle_error(err):
        headers = err.data.get("headers", None)
        messages = err.data.get("messages", ["Invalid request."])
        if headers:
            return jsonify({"errors": messages}), err.code, headers
        else:
            return jsonify({"errors": messages}), err.code

    # models


    POST_TITLE_LENGTH_MAX = 80
    POST_CONTENT_LENGTH_MAX = 5000


    class Post(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(POST_TITLE_LENGTH_MAX), nullable=False)
        content = db.Column(db.String(POST_CONTENT_LENGTH_MAX), nullable=False)

        comments = db.relationship('Comment', back_populates='post')


    COMMENTER_LENGTH_MAX = POST_TITLE_LENGTH_MAX
    COMMENT_LENGTH_MAX = POST_CONTENT_LENGTH_MAX


    class Comment(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        commenter = db.Column(db.String(COMMENTER_LENGTH_MAX), nullable=False)
        comment = db.Column(db.String(COMMENT_LENGTH_MAX), nullable=False)

        post_id = db.Column(db.ForeignKey('post.id'))
        post = db.relationship('Post', uselist=False, back_populates='comments')


    # schemas

    class CommentSchema(Schema):
        id = fields.Int(required=True, dump_only=True)
        commenter = fields.Str(
            required=True, validate=validate.Length(max=COMMENTER_LENGTH_MAX))
        comment = fields.Str(
            required=True, validate=validate.Length(max=COMMENT_LENGTH_MAX))


    class PostSchema(Schema):
        id = fields.Int(required=True, dump_only=True)
        title = fields.Str(required=True, validate=validate.Length(
            max=POST_TITLE_LENGTH_MAX))
        content = fields.Str(required=True, validate=validate.Length(
            max=POST_CONTENT_LENGTH_MAX))
        comments = fields.Nested(CommentSchema, many=True, dump_only=True)


    # dal

    def get_post_list():
        return Post.query.all()


    def get_post(post_id):
        return Post.query.options(joinedload(Post.comments)).get(post_id)


    def create_post(title, content):
        post = Post(title=title, content=content)
        db.session.add(post)
        db.session.commit()
        return post


    def add_comment_to_post(post_id, commenter, comment):
        comment = Comment(commenter=commenter, comment=comment, post_id=post_id)
        db.session.add(comment)
        db.session.commit()
        return comment


    # views


    class PostListResource(MethodResource):
        @marshal_with(PostSchema(many=True))
        def get(self):
            return get_post_list()

        @marshal_with(PostSchema)
        @use_kwargs(PostSchema)
        def post(self, title, content):
            return create_post(title, content)


    class PostResource(MethodResource):
        @marshal_with(PostSchema)
        def get(self, post_id):
            return get_post(post_id)


    class PostCommentResource(MethodResource):
        @marshal_with(CommentSchema)
        @use_kwargs(CommentSchema)
        def post(self, post_id, commenter, comment):
            return add_comment_to_post(post_id, commenter, comment)


    app.add_url_rule('/posts', view_func=PostListResource.as_view('post_list'))
    docs.register(PostListResource, endpoint='post_list')

    app.add_url_rule('/posts/<int:post_id>',
                    view_func=PostResource.as_view('post'))
    docs.register(PostResource, endpoint='post')

    app.add_url_rule('/posts/<int:post_id>/comments',
                    view_func=PostCommentResource.as_view('post_comment'))
    docs.register(PostCommentResource, endpoint='post_comment')

dict.keys() returning something different from what it used to isn't a syntactic change; it's a change in function behavior. Since macros handle syntax, they aren't applicable to a function semantics change.

Now you are telling me something I told you in the first place.

What we might do here is to use two different keys symbols in different packages. We can have a ver2:keys and ver3:keys and control which of these dict.keys() uses in some scope. But that's not macros.

Right. So like I said, macros won't have helped, at all.

Old syntax can be supported side by side with new syntax.

Creating a Frankenstein's monster was never the goal. And besides, they already had tools for code which can run both on 2 and 3.

https://pypi.python.org/pypi/future

So then since we have a way to have old syntax and old API semantics, which is pretty much everything, we can have a nice migration path.

No, it's not a good migration path. 2to3 was a good migration path. Supporting n different versions of apis and syntax isn't a good migration path.

This has gone way too long. You made this claim:

"If Python had macros, Python 2 to 3 migration would be a non-issue."

That is patently false. I don't know why you can't simply accept you were wrong but I must check out now.

I don't follow.

if the hypothetical floop syntax changed there could be a ver2:floop and ver3:floop.

dict.keys() returned a list earlier, now it returns a "view". dict already had keys() and iterkeys(). Is that what you were referring to by your ver2:floop and ver3:floop? They changed keys() to act essentially like iterkeys() and removed iterkeys() because per them, this is the correct behavior.

Most changes in python 3 won't be helped by macros. Macros would have helped if they were adding say pattern match. But even then, it doesn't really matter much. If python itself is adding pattern match, they can write it in C, or python, or write a macro(if python had it) - it would have been all the same to me.

I am not saying macros aren't useful. I am saying macros are useful in limited circumstances and existence of macros won't have done anything for python 2 to 3 migration.

Someone else wrote that syntax and you benefit from it, just like you benefit from existing macros in a Lisp.

Are you following the discussion? The whole discussion arose from somehow macros make up for non-existence of libraries in Racket. Someone else wrote all those libraries for popular languages and I benefit from those existing libraries. Macros do fuck all if I have to wrap them myself. And even if I have to, most of the times it will be way simpler to wrap it in Python/Ruby.

You wrote a novella on your hypothetical macro use cases. I wrote I know what macros are. I don't know why you are throwing that at me.

If Python had macros, Python 2 to 3 migration would be a non-issue. It wouldn't be a topic of discussion that non-Python-programmers know about.

This is what I mean when I say macros are a meme.

No, it won't have helped, at all. The changes in python 3 break the existing python 2 code.

For example, this no longer works: k = d.keys(); k.sort(). Use k = sorted(d) instead (this works in Python 2.5 too and is just as efficient).

The ordering comparison operators (<, <=, >=, >) raise a TypeError exception when the operands don’t have a meaningful natural ordering

builtin.sorted() and list.sort() no longer accept the cmp argument providing a comparison function.

The biggest difference with the 2.x situation is that any attempt to mix text and data in Python 3.0 raises TypeError, whereas if you were to mix Unicode and 8-bit strings in Python 2.x, it would work if the 8-bit string happened to contain only 7-bit (ASCII) bytes, but you would get UnicodeDecodeError if it contained non-ASCII values.

I could go on, but you get the idea.

assumming the use of WSDL the only thing a macro could do is equivalent of what an external program that generate a python file implementing the WSDL could do.

I am not assuming the use of WSDL and macros still don't do much.

Reducing boilerplate could make your code less buggy (bugs you catch with your eyes) and could make the meaning of the code more clear.

Macros aren't required for reducing boilerplate and don't necessarily reduce boilerplate compared to a non-macro solution in an expressive language.

I read almost all of racket's documentation cover to cover and learnt Clojure about 5 years ago. There are a lot of good things to say about them but as far as expressiveness go, but I didn't found them anymore expressive than Ruby or Python.

Racket match is realy nice but it will shine if: - You use a lot of immutable datasctructures. - Explore shallow tree like data structures.

The things you pointed out are non-macro things. I like match, especially when it's well integrated in the lang. viz f#. I just don't like the difference that being able to cook up your match using macros makes a huge difference when it comes to programming productivity.

i don't think macro are a meme

You misunderstand my point. Code generation with or without macros is useful. That's not a meme. "Macros are a secret sauce" is a meme.

Macro can help for two things

I know what macros are and what macros can do. The parent poster made a comment that somehow macros can help overcome non-existence of wrappers in Racket. We both agree that macros won't help in this case, and my personal opinion is macros are a meme. They help some in very limited circumstances yet they are touted as a productivity multiplier. A pattern match over if-else doesn't really buy much. It's nicer, sure, but not by much.

A language with large standard library and tooling is awesome. But Racket still falls short on api wrappers for tools(message queues, zero mq, templates...) and services(payment gateways, google cloud or azure apis...). It's a chicken and egg problem. Unless a significant number of people start using it in production, Racket isn't going to have extensive libraries and unless it has the libraries to hit the ground running, a significant number of people won't try it.

The thing that is the Special Sauce for Racket is it's macro system. You can build your own language for specific things easily or you can extend Racket with a library also much easier then the other 5-6 languages.

Compare the raw format:

https://stripe.com/docs/api/curl#metadata

with Python:

https://stripe.com/docs/api/python#metadata

How are macros going to give me a better solution that the one which exists, is tested and have been used by others for some time? Besides, macros are a meme. What difference are macros going to make when wrapping a api? Can you show me an existing lisp/clojure wrapper which is more expressive than python/ruby?

And then I asked, why would one need a "list of activities" to make that point? I don't see how that would work, seeing how those activities also have contexts and motivations which matter.

All right. I will give it a last try. You would need a "list" if you are the one making a point that hiding your gut is just dignity while posting your abs online is narcissism. I was pointing out to parent poster that this point is not conducive as your are defining dignity and narcissism to suit your point of view. I don't understand how you missed it when it's written verbatim in the comment you replied to.

Your comment was an own goal, I'm just beating a dead horse.

And here we go again. You think of something and put it down in your comment irrespective of context. What dead horse are you beating and why does this phrase make an appearance out of blue here?

It's more mocking people who I consider lame.

At least we have the same agenda here. I too enjoy mocking bottom feeders who write diatribes out of their jealousy for people leading a better and more fulfilled lives than them.

Which brings us back to your projected "Now you are making up arguments on my behalf and posting your retorts." haha.

Again, I am sure you think you have a point here and I am supposed to have an epiphany when I grok it, but honestly, all I see is random sentences chained together. I once saw a video of some pastor who brought a rock to a talk show as an irrefutable proof against evolution. I am kinda feeling the same as the talk host felt.

Cool man. You do you. Continue "caring for others" by, uh, posting comments on hn I suppose, and "being better", uh, again by posting comments on hn.

I don't have a particular affinity towards or against insta influencers or youtube stars. I just find the comments amusing.

"I am so much better than insta influencers because, uh, I have a job? I don't seek validation from strangers? I am not sure but I sure know that they are the downfall of the humanity"

but what has it to do with dignity? And why would anyone need a "list"?

Conversations have context, you know. Parent poster mentioned dignity being different. Did you not read the or are you intentionally clipping it.

"Creating content" has as much "value" as people give it in form of "attention"

Is..is that supposed to be an insult or some deep insight you stumbled onto? I don't understand why you are stating the obvious with such conviction and quotes.

Work 50 years, rob someone who worked 50 years, you can buy the exact same thing... get X views doing A, or X views doing B, it's still just X views.

You are kinda going off the rails here buddy.

I guess I should make a youtube video about it, then it'd be valid even if it called out other youtubers? Help me out here, since apparently typing a comment in a text box is not creating content if it rubs you the wrong way.

Cool. Now you are making up arguments on my behalf and posting your retorts.

You're basically saying, if you found a bug, don't talk about it, fix your own copy and just use that.

That doesn't even come close to being an analogy.

What would you know about ambition?

I can explain that to you. Or you can go back and read the conversation again, slowly.

What if my being better includes speaking my mind? Riddle me that.

Maybe try to be actually ambitious rather than being content with raging over people doing better than you.

If our best and brightest young children become internet celebrities because it made good sense, then there won't be anyone to keep the gears grinding.

So do you also support not educating a vast majority of children because if everyone aspires to be a white collar worker, where will we get our janitors and garbage men from.

Think of how that forms the development of a young child.

It depends.

Option 1:

"Hey buddy. So you want to be a youtube star. Which ones you like? The funny ones? The lifters? The fashion vloggers? It's actually a lot of work. You will need a script, a cameraman, a director, actors etc. And all said and done, for every youtube star, there are tens of thousands who just toil in obscurity. But that's a risk which comes with a lot of life's decisions and you can decide later on if you really want to do it or if you want to do it part time.

Back to the production process. It's not very different from what we do in our school's theater except that there is a massive potential increase in your reach. Why don't you try coming up with a concept and I can walk you through the iterations it takes for the final product. We can even try to schedule a screening for the class and put it on youtube."

Option 2:

"Youtube star? SMH. What has become of today's generation?"

I share this sentiment. I dump almost daily photos on whatsapp statuses. I won't do it on insta or fb(except on their analogous stories/status feature). I like posting updates but since I don't like when people clutter my wall with a lot of updates, I don't do it to others. The only people who see my updates are people who explicitly click on it to see it.

dignity (the desire to be respected by everybody)

Weird. I thought dignity is self-respect(not respect from others).

So do you have a list of what earns you dignity vs what is narcissism? Like covering your gut in loose clothing is fine but god forbid you post your abs on insta where only people who see it are people who willingly followed you to see it and the people who went on to explore tab to see it and then jumped on hn to whine about it.

the desire to be perceived as the best person ever by as many people as possible.

I don't know - sounds like ambition to me.

Insta has given aspiring models a mostly democratic platform. You don't have to be a size zero or white or what have you. Build your reach and you are a model. Same goes for youtube - it has vastly empowered indie content creators. Of course there are millions of people who post their photos seeking validation from friends and strangers but what of it? Humans have been seeking validation from strangers since time immemorial otherwise why have lavish weddings or expensive wedding rings or expensive cars...

IMO people complaining over overt insta sharing are self-righteous whiners. I see it on the same level as being outraged over Rebecca Black. Don't like it, don't seek it. You think you are better than others? Don't tell, go actually be better.

I'd totally do it if I could.

This seems like the root of your issue.

But it's definitely vanity.

The only people to use vanity as an insult are people who have nothing to be vain about.

Do you cover your grays? Do you wear flattering clothes? Do you buy nice phones? Why bother? It's all vain shit.

If a calorie is a calorie is a calorie,

A calorie is a calorie, period.

"Sawdust has calories. Try eating that".

Doesn't matter. Whether the body can extract calories out of it doesn't change the definition of calorie and a calorie is still a calorie.

"But some foods are more filling and satiating than others despite the calories being the same"

Still doesn't matter. How does how long the body takes to process calories out of food affect "a calorie is a calorie".

You must already know this. I might have been a bit pedagogical but that's because "a calorie is a calorie" is false is one of my pet peeves.

More to the point:

then we need to be able to explain why two people eating the same amount of calories per day, but one eating a high fat, low carb diet, and the other a low fat high carb diet see starkly different outcomes.

Studies please. Especially for "starkly different outcomes". I can copy pasta the famous /r/fitness link dump which is posted every time keto comes up but I will wait for you to find me some studies supporting your argument first.

All things equal except the composition of their diet, the person on the HF diet will stay lean and feel consistently satiated, while the LF person will put on more fat and feel hungry far more frequently than the HF.

So I can feed 5000 kcal/day to a 5 feet girl and she will stay lean as long as it's olive oil shots?

IMO, the claim that all calories are created equally is the most damaging "science" that's been put forth as common knowledge about dieting.

But all calories are equal, by definition. Some people do well on a high fat/high protein diet, some don't. You want to lose weight, burn calories(eat less, move more) above your tdee. You want to gain weight, give your body more calories than it burns. As annoying as hearing this may sound(it isn't annoying to me but for argument's sake), that's all there is to it. People have lost weight and maintained lean mass on all sorts of shitty diets. If high fat diet works for you, superb. But it's not a panacea and the science is no where as clear cut as you make it out to be. In fact, keeping protein constant, a high fat and high carb diet had the same results.

You seem to imply people care too much about TED yet the only one who keeps up bringing TED is you.

I also find it amusing you seem to have disdain and a feeling of superiority to startup bros and their emojis yet from a cursory glance, it doesn't look like you are doing anything out of ordinary or have achieved anything worthwhile yourself.

There are people who find "the alchemist" deep and life changing and there are people who find it trite and useless. You seem to be the first kind and I am latter. Nothing could come out of this conversation for you or me, so I will sign off now.

The point is far more likely to be lost if I simply straight-up tell

The prerequisite for the point being lost or you jumping straight to the point is you having a point in the first place and that doesn't seem to be the case from the comments you have posted so far.

Born to Rest 10 years ago

If you don't have a cola each day, you can dribble into a towel for another 3 years when you are older.... No thanks, Ill take the coke. put it on the reapers tab.

But fit people have better quality of life.

https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3567315/

http://www.heart.org/HEARTORG/HealthyLiving/PhysicalActivity...

https://www.ncbi.nlm.nih.gov/pubmed/22249758

https://www.sciencedaily.com/releases/2005/11/051110215438.h...

If anything, an unfit person is slowly dribbling in a towel throughout his relatively shorter life.

You live a shorter, low quality life. I don't see how you see that a positive over living a longer, healthier life with may be a bit of suffering at the end compared to suffering throughout your life(out of breath, joint pains, clogged arteries...)

https://www.youtube.com/watch?v=2xGp5anlXSA

The video posted in another comment doesn't look that bad.

I am not sure about the grade, but one of the Bangalore's weekend gateway has some steep sections(a low average grade but some sections are steep).

https://www.youtube.com/watch?v=C0_MyaPzM88

That footage is from a rally but every weekend, fwd cars with 800/1000cc engines and a peak torque of about 70 Nm do it just fine. Most of the cars have 2-5 occupants decreasing the already low torque/kg, and almost the whole climb is done in a bumper to bumper traffic(no momentum for the climb).

https://dc-cdn.s3-ap-southeast-1.amazonaws.com/dc-Cover-nj6b...

You didn't 'have' to do any of these, especially for a project of this size

Where did I mention I had to do any of these for a project of this size(or any size), and since when TODO list is a project?

The purpose of the template is to prepare a template(duh) and understand how and where each library fits in.

The JS development landscape is in a state of flux, and it's overwhelming for someone not familiar with it.

I was just working on getting a react-redux TODO template ready and number of things I had to read up on was enormous. https://github.com/rahulkmr/react-redux-todo

I had to read up on react, then on redux, then on es2015/babel, then on browsrify, then on gulp, then on eslint, then on sourcemaps, then on flow, then on react-router...It was a lot of effort, but I am liking it so far. The important thing is we can build applications in ES2015 which is a better language than the browser's js implementation and still get to debug it on the browser(sourcemap and specific devtools). My impressions of react-redux so far is it makes implementing a TODO list harder, but it will be better suited for applications with lot of state.

True there are conflicting choices and advice, but I think all this will stabilize in a year or two and despite the naysayers, the future seems bright. And it's not a take-it-or-leave-it deal - if you are happy with Backbone, keep using it. You can choose to just integrate gulp,babel and browserify for es2015 goodness. You might not like react but like how redux does state management - just integrate that in your existing application.

Most of the tools are orthogonal to your framework choice. Use tern for completion and analysis, use eslint for linting, use browerify/webpack to pack your assets...