I’m kind of on the fence about this; while I can agree (and might even make use of it), I’m always reticent of the possibility of censoring people. Although, in this case, I’m not sure it is censorship; it seems it would function more like a kill file (which is how I’ve made a few mail lists readable).
My sentiments exactly.
I dare say, perhaps this would be another good fit for a browser addon? Something that may compromise the site’s goal, but could still be useful for some users. (Obviously, the result would be greyed-out or striked-out entries, rather than big blank gaps)
I agree as I would not be able to easily use plugins on my phone or other other devices I may not be the owner of.
It’s absolutely not censorship in any case. It’d be pretty silly to say that I’m censoring someone by ignoring them.
The user controls who they wouldn’t like to see, not an organisation.
I’m always reticent of the possibility of censoring people.
A user is still submitting content to the site which is displaying it by default to everyone. For those that want to opt out, i.e. filter a user, it’s no different than filtering a tag. If it’s censorship, then so too is tag filtering. I don’t see it as any worse in that regard. And it’s potentially much more effective, without forcing me to filter tags I don’t want to filter. (I will do this if I have to or possibly just cull my reading of lobsters, whichever is easiest.)
I’ve been thinking about this same issue quite a bit lately. I also put myself in the camp of “not smart enough to Haskell”. :)
I know Haskell can prevent a class of errors at compile time but I’m curious if anyone knows if that comes at a higher cost of other types of errors. For example, I find Haskell (and functional languages in general) to be less readable than their imperative counterparts. Does poor readability cause errors when code reviewing or when translating requirements to code? Does abstracting the underlying hardware to high level abstractions cause performance issues down the road?
I’d be curious to hear from functional language folks and from people who used to be functional programmers and have switched back to imperative languages.
Ultimately I agree with kellogh that programming is not the end goal. It seems like it’s possible to write solid code (or shit code) in any language. There are trade offs to everything. I personally love Go because it’s simple and easy for me to reason about.
For example, I find Haskell (and functional languages in general) to be less readable than their imperative counterparts.
It’s interesting because my non-technical friends find imperative languages to be equally less readable as compared to functional languages. This may sound like hyperbole. But bear with me, because I truly believe there’s something important that’s revealed about our assumptions here.
So what exactly do I mean? You learned one way of formulating logic and now it feels natural to you. But I argue there’s nothing inherently natural about it. At least not in a way that isn’t inherently true of functional programming or logic programming or…
Learned patterns do feel natural, but you probably could have just as easily learned some other paradigm and then have argued that imperative languages were difficult to read.
Does poor readability cause errors when code reviewing or when translating requirements to code?
The salient point here is that this whole “functional programming just isn’t as readable” argument is specious: once you learn the idioms, it isn’t true. Also keep in mind, you had to do the same with the imperative paradigm as well.
So no, it doesn’t, because people who have learned functional paradigms don’t suffer from this mythical poor readability ailment. Granted, if you aren’t familiar with a given paradigm, then it’s legitimate to state that for you there is potentially an issue of readability.
My advice? Learn functional programming! :) It really isn’t as hard as it might seem.
I’ve done a fair amount of CL (the One True Lisp ;)), Clojure, and OCaml, dabbled with Erlang, and poked about with a couple other functional languages, and Haskell is still a language I view in the same light as XKCD. However, the fact that I don’t care for the language at all doesn’t mean I’m going to start telling people to stop using it. At the end of the day, build useful, interesting stuff in whatever language gets the job done. For me, that’s mostly Go with some C. For others, it might be Haskell. I don’t really care.
It’s self-deprecating humor though, as parts of xkcd is written in Haskell.
Learn functional programming! :) It really isn’t as hard as it might seem.
I wholeheartedly and unequivocally agree.
However, I’d like to maybe elaborate a bit on this “FP has poor readability” notion. I basically agree with your conclusion (that many of us got used to a different paradigm, so something foreign can be difficult to pick up). But I think there’s more to it then that, at least, for Haskell. (And I know you didn’t mention a specific language, but that’s what I’m going to talk about.)
When starting Haskell, I primarily struggled with two things. The first was being able to read someone else’s code (like, a piece of the standard library or a popular package). The second was laziness. The first is crucial for me personally, because that’s one of the primary ways that I pick up a new language.
I attribute the difficulty of reading someone else’s Haskell source code with the prevalence of Haskell extensions (GADTs, type families, fun deps, existential quantification, higher-rank polymorphism) and the absolute necessity to understand monads and monad transformers.
To your point, it may be the case that if monads were only called Warm Fuzzy Things, it wouldn’t have been so hard. But the bottom line is, I didn’t completely understand them, and it made reading source code (or even the Haddock documentation) incredibly difficult. Once I had that “ah ha!” moment about monads, it’s truly amazing how much code and documentation became almost immediately accessible to me. But it took a long time to get there.
Beyond that, Haskell is a dumping grounds for new academic research. (Which is a good thing!) But as curious programmers that like shiny new things (me included), it’s hard to resist an opportunity to use those things when the opportunity presents itself. But this imposes a huge hurdle on beginning programmers (or, just programmers new to FP in general) that learn by reading someone else’s code.
In general, I don’t think FP has poor readability. But I do think there are some concrete hurdles that beginners need to overcome to learn a language like Haskell. But as should be clear, these hurdles don’t really apply to functional programming in general, but rather, to Haskell specifically. (In my experience.) But we shouldn’t blame beginners for conflating Haskell with all of functional programming. :-)
You learned one way of formulating logic and now it feels natural to you. But I argue there’s nothing inherently natural about it.
Good point. Certain elements (e.g. tail recursion instead of a loop) feels very unnatural but I certainly have a bias.
My advice? Learn functional programming! :) It really isn’t as hard as it might seem.
I’m going to give it another go. I definitely know a lot of smart people who are functional programmers.
For example, I find Haskell (and functional languages in general) to be less readable than their imperative counterparts.
You really need to qualify readability before talking about it. The only sensible definition of readability that I’ve found is “to what extent does this code preserve equational reasoning” - a definition which is not only simple but also measurable.
Which is exactly why I find Haskell to be readable.
Does abstracting the underlying hardware to high level abstractions cause performance issues down the road?
Haskell is extremely fast precisely because it’s high-level. A compiler has deep introspection into your code. For example, it can inline code, automatically specialise, fuse equations and decide when things should be evaluated.
It seems like it’s possible to write solid code (or shit code) in any language.
I don’t think this is true. Would you be so diplomatic to Malbolge, INTERCAL or Whitespace?
I agree that programming is not the end goal. You use the tool that is best for the job. Go happens to be a very good tool for distributed systems.
Having said that, strict functional languages like Haskell sometimes are the best tool for the job. In my compilers class in university, we developed a compiler in OCaml. Things like algebraic datatypes and pattern matching come in really handy when you’re processing a complex AST. I wouldn’t say functional programming languages are less readable. If you get familiar with the language and do things in an idiomatic way, the code can be very clear and concise. Also, you tend not to run into bugs because the compiler detects a lot of them as type errors (although the compiler error messages can sometimes be really cryptic).
One more point to the readability of code. The longest part of the software development lifecycle (open source or otherwise) is maintenance. If the code you wrote truly has no side effects then it should be really obvious what’s going on when you go to track down a bug 5 months after you wrote the code. Of course this may or may not have anything to do with the language (though perl is fairly frequently a write once language) but there are languages that take longer, and are generally coded in a fashion that’s harder to troubleshoot and read later on. For instance, concurrency in java can be done and is more easy to read than in assembler. There are languages that just about any developer can jump in and read and figure out what’s going on… now being that I’m not smart enough to learn Haskell I have no idea what it looks like.
I actually agree with the people who say that the lack of generics is serious. It prevents people from writing general-purpose libraries, or at least makes it harder. That said, there are many decisions the Go team made that I respect highly. Go is a language made for Google. It solves many large-scale production problems extremely well, and its concurrency model is neat as well. (I’d prefer to use Clojure and core.async, but that’s just me.)
I’ll give you a hint, which is that there’s nothing wrong with the language. The problem is that we do a piss-poor job of understanding what it is we expect from programming languages right now, at least members of the pop-software culture (myself included).
Agree whole-heartedly. The quality of a programming language is impossible to assess independent of the context in which it is to be used. I understand that people are generally infuriated at having to use underpowered languages (say, Java) at their jobs and, worse yet, the shitty tools and design principles that often come with contemporary OO, but it’s not Go’s job to liberate them. No language right now does everything perfectly, and that “one language to rule them all”, risk-averse-businessperson, type of attitude (that immature engineers often cop) is the real enemy.
It solves many large-scale production problems extremely well, and its concurrency model is neat as well. (I’d prefer to use Clojure and core.async, but that’s just me.)
One thing to note here, I believe it was Rich Hickey or perhaps Timothy Baldridge who pointed this out at Clojure/conj 2013: “I wouldn’t want to use any language that only had a single concurrency model”, to paraphrase. This came up during a core.async discussion and I think it’s a really good point to make.
Consider that while CSP-style concurrency is clearly suited to many problems, you still need to be wary of deadlocking the parent thread. This implies that certain tasks should not happen on the logical threads provided by Goroutines or inside go blocks in core.async, e.g. blocking IO.
A related problem is that when you’re given a lens with which to see the world through, you start to see all your problems in terms of that framework; if given a hammer, suddenly you see nails everywhere. So in the case of CSP and Go, the danger, I think, is that then you start to shoehorn all your problems into what Go is capable of. Whereas a language like Clojure gives you the same capabilities in terms of concurrency model, but also allows you to do what you want by way of providing additional models for concurrency and being flexible enough for you to do essentially whatever you want.
I’m not sure, but I think blocking IO inside a Goroutine isn’t much of a problem because IO calls cause the current goroutine to yield. At least, I would be incredibly surprised and disappointed if this were not the case.
I don’t know the precise details of how this is implemented in Go, so I’ll explain the problem from the Clojure core.async perspective, where it is well known that blocking tasks should not live on logical threads. I believe in the case of Clojure, assuming you’re on the JVM, there is a thread pool. However, imagine you’re doing a lot of blocking IO, on the order of thousands of logical threads. Ultimately, the thread pool is starved and you’re blocking on the logical threads. This causes the parent threads to deadlock.
I would be curious to know if Go has some mechanisms around preventing this? Perhaps even the Clojure implementation does which I’m misrepresenting here. However Timothy Baldridge has said on numerous occasions that you should not do long-running or blocking tasks in logical threads, instead you should use real threads for that. Otherwise you risk deadlocking and strange performance outcomes.
Edit: Here’s a pretty decent blog post talking a bit about this issue in Clojure.
However if you are using go blocks and blocking IO calls you’re in trouble. You will in fact often get worse performance than using threads (in the normal case) since you will quickly hog all the threads in the go block thread pool and block out any other work!
Go’s scheduler and it’s IO stack are tied together to prevent IO from blocking goroutines. It’s something Clojure cannot due because the JVM’s scheduler is not under its control.
I’m incredibly excited about Rust, conceptually, but I’ve waited to actually dig in because I’ve seen a fairly consistent stream of Tweets that seem to indicate each point release completely breaks whatever it is they’ve been working on–of course this is entirely expected pre-1.0. However, for someone like me who would like to play around with Rust, when is a good time to start? Should I hold out for 1.0?
If you’re just playing, now is a great time to start. But don’t put any stakes on it. You can make OSS projects, but keep in mind there’s still a bit of work version to version to keep them up to date.
This was a great talk; Clojure/conj was great this year. Schema has the feel of being what 90% of web developers want when they say they want “static typing”.
Compile-time typing definitely has its uses, but most of the time, what people care about is interface integrity– which ought to be a high-ranking consideration no matter how dynamic the language is.
Compile-time typing definitely has its uses, but most of the time, what people care about is interface integrity– which ought to be a high-ranking consideration no matter how dynamic the language is.
Very recently I found myself lamenting the fact that Python by-and-large completely eschews this, primarily in terms of culture. The argument is always “well it’s duck-typing, so get over it”. But while this may sound fine on the surface, I challenge people who advocate duck-typing to come up with sane ways of managing consistency and understanding in large code bases and teams. I work with a fairly small team and even here we have plenty of issues with team members simply grappling with and understanding the code. This is what was so eye-opening about Schema for me and frankly I think languages like Python could really benefit from something similar.
Tags are typically used for two reasons:
A. So you can filter out things that you don’t care about
B. Tags are a guideline for what should or should not be posted on lobsters.
I don’t know if there is a big group of users that will want to filter out clojure but not lisp. I also don’t think there is anything that is not getting posted because we lack a clojure tag.
There could be a small win in separating the lisp tag into every single variant of lisp (some people might hate, say, arc, or racket so much that they never want to see it) but I’m not sure it’s worth the effort.
What do you envision the purpose of such a tag being?
I don’t know if there is a big group of users that will want to filter out clojure but not lisp.
Conversely, I find that tags are useful for filtering positively, rather than negatively. In other words, I can see all “compsci” news as a separate view. This is exactly why it makes sense to have an Erlang or Haskell tag, and not simply a “functional” tag. While Clojure is debatably a Lisp, it would be nice to have a Clojure view, given its idiosyncrasies juxtaposed the broader Lisp world via the “lisp” tag. I certainly enjoy reading about Scheme and Common Lisp, but sometimes I prefer to read about Clojure specifically, as opposed to other Lisps.
FWIW, I am definitely one user who’d be interested in news about Clojure but not the wider world of lisps - the communities seem different enough that I’d expect this to be relatively common, but that’s really just a gut feel.
I do an awful lot of interviews. Sadly, few people ask questions like this.
It’s too bad because at least with me, I’m far more impressed with candidates who turn the tables on me and interview me as well. Far too many end up just trying to be “amendable” and “impress”. My advice to people interviewing is, don’t worry about fucking it up. Think about what you want in a job and make sure the place you are looking at will give you what you want. If the place is really good, the interviewer is probably going to be delighted that you asked more probing questions.
I worry a bit about this advice – asking tons of questions is working well for me right now, but it also depends on the market and how much privilege/power you have as an interviewee.
and if you don’t and end up somewhere were you only got the job because you didn’t ask questions? it fills an immediate economic need but we are talking about software engineering jobs. the ratio of supply to demand is greatly skewed towards demand.
Eh, I’m totally on board the ask-lots-of-questions train–I have been known to ask more questions of my interviewer than they asked me!–but let’s not pretend there’s not risk involved. For example, a company’s parental leave policies are a GREAT (maybe one of the best) indicators of their approach to gender relations and work-life balance, but as a woman of childbearing age there is no way in hell I’m risking an offer by bringing that up in an interviewing situation, even though I know that legally and in a perfect world that is not supposed to influence hiring decisions. (FFS, I feel the need to disclaim that I have no interest in taking advantage of anywhere’s paternal leave anytime soon, in case someone I know in real life is reading this!) Most of the questions under “quality of life” have similar implications that can potentially be negative; if you’re working against various implicit biases to begin with the risks involved in even planting that seed of doubt may not be acceptable. There’s other skews than demand over supply in the software engineering world…
i wasn’t trying to say there is no risk. i’m suggesting that not asking those questions mean you risk ending up somewhere you aren’t going to want to work and that has to be balanced again the need for gainful employment. we are fortunate as engineers that we can be more selective. unfortunately, due to various biases, some of us can afford to be more selective than others, but as a profession, we are blessed that we can regularly take this into account.
Agreed! I’d add that if you’re on the hiring/recruitment side it’s worth thinking about how your potential hires are weighing that risk vs information calculation. If the answers to any of those more risky questions are a selling point for your company, getting out ahead of that dilemma by volunteering that info up front or highlighting it in your job listings is a great idea.
It doesn’t need to be tons of questions, but 3 good probing questions can easily give you a feel for what the company and environment are really like.
My advice to people interviewing is, don’t worry about fucking it up.
I think I understand the intended mindset this is meant to advocate, but I wonder if this works when I know I’m interviewing for my dream job? How do I not worry about the interview, when I, as the interviewee, already know the job is precisely what I want? This seems like a special case where my primary objective has to be to impress and possibly show I’m amenable (we’re talking about a dream job after all).
Further, what if I give the interviewer the wrong impression by asking questions that could either be interpreted as pedantic or intrusive? What if I give the interviewer the impression I don’t trust the company to get even the basics right? Leading with the impression that I’m concerned at once with small details most decent places are bound to get right or showing mistrust doesn’t seem like something an employer is likely to respond positively to. Conversely I do see how some of these questions might be interpreted positively, as showing an interest in the particulars of the job and how they relate to you as a potential employee–certainly that should be a positive signal to the interviewer.
However, if I know I’m interviewing for my dream job, I’m probably not wondering if they use version control, for instance. And asking a question like that seems like it could be a bit of a red flag or at best noise that could be avoided in favor of more relevant discussion. So maybe this list is potentially less applicable to an interview you know you can’t fuck up. In which case, I’m not sure I can walk into an interview without worrying if I’m going to make a misstep.
like your own personal hellban
Pretty much every social network ever has a feature to “block” abusive users. So yes, usually you have access to your own personal hellban, if you want to think of it that way.
I think this is a defining point of your proposal. Are you trying to solve the problem of user abuse? Or do you just not want to read comments from people you tend to disagree with?
If it’s the former, I think there are other measures of fighting it that we should give a chance to work. (The user tree, invitation model, explaining down votes, etc…)
But if it’s the latter, I’m not sure I agree with it on principle. Dissenting opinions make for more interesting conversation.
The system could be somewhat smart, and if a comment by someone you’ve blocked breaks a threshold of votes it’s shown regardless of your personal settings. Also if they reply to something you’ve written.
Using a threshold individuals would still be able to say “hide things by these users” but with an added “unless the community thinks they’re good”.