Interviews: Ask Alan Donovan and Brian Kernighan About Programming and Go 185
Alan Donovan is a member of Google’s Go team in New York and holds computer science degrees
from Cambridge and MIT. Since 2005, he has worked at Google on infrastructure projects and was the co-designer of its proprietary build system, Blaze. Brian Kernighan is a professor in the Computer Science Department at Princeton University. He was a member of technical staff in the Computing Science Research Center at Bell Labs, where he worked on languages and tools for Unix. He is the co-author of several books, including The C Programming Language, and The Practice of Programming. Recently, the pair have co-authored a soon to be released book titled The Go Programming Language. Alan and Brian have agreed to give us some of their time to answer any questions you may have about the upcoming book, Go, and programming in general. Ask as many questions as you'd like, but please keep them to one per post.
OpenGL and LockOSThread (Score:5)
Hi, I've stopped using Go when I saw the hacky stuff I need to do to get libraries like OpenGL to behave correctly. (see https://github.com/golang/go/wiki/LockOSThread) Are there any plans to fix this?
Re: (Score:2)
Re: (Score:2)
Yes, OpenGL is a big hack. Why is this Go's problem?
Re: (Score:3, Informative)
Re:OpenGL and LockOSThread (Score:4, Interesting)
AC was referring to the fact you need to run all OpenGL code from same thread. Go's goroutines are not guaranteed to run on same thread (unless you do some black magic sorcerery).
A deficiency that's not Go's problem to solve IMO.
Re: (Score:2)
So you're saying that people should adopt Go only once all the major deficiencies in other common software systems have been addressed? That's going to be when hell freezes over.
(In addition, there are reasons for why OpenGL is the way it is; it's not a deficiency, it's a tradeoff.)
Re: (Score:2)
Maybe switch to Vulkan.
Re: (Score:2)
You have obviously no idea how the lower-level architectures of your computer operate.
On some platforms (eg. Intel), a single processor will have access to only a portion of the busses (eg. the PCIe bus and the memory). So anything that has access to specific hardware (say a GPU or a specific memory area) has to run on a specific processor (and that is done at a higher level by keeping it in the same thread). Sure you can go about it by doing an (automatic) memcpy every time you need to switch physical proc
Re: (Score:2)
Heh, I'm an engineer at a graphics card company and part of architectural team there. So perhaps you have me confused with someone else and took my comment in a completely different context than I intended.
I have a love hate relationship with OpenGL, my accusation that OpenGL is a hack is perhaps a tad hyperbolic. I see a lot of the warts having to work with the driver details for a living (system sw team), but it is interesting to work on and does feed my family.
Re: (Score:2)
Why even use OpenGL directly? It's been called the assembly language of graphics. It has no brains when it comes to sorting polygons by visibility, it just dumbly draws everything in the list your program builds for it, whether visible or not. It's up to your source code to employ a little algorithmic cleverness to prune the list. But even if you do, you soon find that unless the pruning is very good, performance is still unsatisfying. To make the pruning excellent requires implementation of some fairl
Re: (Score:2)
Because, quite often, you don't want to use a library. I like Ogre, but I do a lot of OpenGL stuff too, it's just convenient when you have simple scenes. This is more common than it may seem, I have several tools I support for my team (or have supported in the past) that are just very simple OpenGL calls.
Re: (Score:3)
The world is full of "big hacks" and shitty software, so languages that can't deal well with such systems aren't going to cut it. In different words, it's Go's problem because users aren't going to use Go if they can't get their work done in it.
Re: (Score:3, Informative)
Instead of linking your app to OpenGL you can instead create a separate process that will do that and communicate to it through a socket. You know, like X11 does. This way you are not putting driver guts in your process space like Win 3.1 used to do. See http://msharov.github.io/gleri... [github.io] for an example.
No "Autotools" or CMake configuration layer (Score:2)
The very first thing I tried to compile under Go's build scheme failed because of headers I don't have for a sub-service I don't need.
It was the "cups connector" for Google cloud print and it wanted libavahi.h even though I don't want or need any of that local network auto configuration stuff.
If the build system can't do what "configure" (autotools) does, or CMake, or CPAN, or any of the other portability systems, then it's not really portable is it.
Go? It went right to bit-bucket for now.
Wisdom of naming it "Go" (Score:5, Insightful)
Re:Wisdom of naming it "Go" (Score:4, Interesting)
Re: (Score:2)
Re: (Score:3)
There's already a game called Go, which has about a gazillion articles on how to program it. Couldn't you come up with a name that would be less ambiguous? Now, when you see a user group for "Go programming", you have no clue which one it is.
In conversation, I refer to it as golang. You are right on your point about potential for confusion but I don't think your example is apt anymore. Googling for programming go [google.com] appears to yield only results about golang. Also, it is not without tangential benefits like being able to call Go developers "gophers."
... that's no longer the case when I google for groovy programm
I think when I first started programming Groovy long ago I stumbled upon a website promising that software development was groovy
Re:Wisdom of naming it "Go" (Score:4, Funny)
why couldn't the name have been a SHA-256 hash of the initial specification document or a UUID. So instead of "Go" we could all say "one two three echo four five six seven dash echo eight nine bravo dash one two delta three dash alfa four five six dash four two six six five five four four zero zero zero zero". Then it wouldn't be ambiguous and unlikely to have search collisions if you search as "123e4567-e89b-12d3-a456-426655440000"
Re: (Score:2)
Re: (Score:3)
The problem is for us who want to read about programming Go, the strategy game, and don't care in the least about some new, fancy programming language.
Re: (Score:3)
Couldn't you come up with a name that would be less ambiguous?
Forth [wikipedia.org] was already taken.
Re: (Score:2)
Go and Rust are both stupidly named. Try googling "go" or "rust". It's hopeless.
Comment removed (Score:4, Informative)
Re: (Score:2, Informative)
Re: (Score:2)
Why the hell would anyone use Go? (Score:5, Insightful)
Why the hell would anyone use Go?
(Serious question, since our editors didn't tell us why Go was created, what Go's intended purpose was and whether or not anyone is actually using Go.)
Re: (Score:3)
Why the hell would anyone use Go?
(Serious question, since our editors didn't tell us why Go was created, what Go's intended purpose was and whether or not anyone is actually using Go.)
As a software developer here that likes to fiddle with all languages, the second paragraph [wikipedia.org] from Wikipedia seems to answer your question nicely: "It is a statically typed language with syntax loosely derived from that of C, adding garbage collection, type safety, some structural typing capabilities,[2] additional built-in types such as variable-length arrays and key-value maps, and a large standard library."
So from the first few words someone might know C and desire garbage collection to be handled for
I worry about autonomous language activities (Score:2, Insightful)
Well, if all of computer language history is any guide, that's going to present an asynchronous performance issue.
I'm a C programmer by choice. I require that the program does what I told it to, when I told it to. Anything else is malbehavior. Data structures are not garbage unless and until I say they are. So, if go follows the example of every other garbage-collected language I've run into thus far, I'd need to disable garbage collection (and most likely anything else that is runn
Re: (Score:2)
Go is obviously not for what you do. Neither is Java or C# for that matter..
I would put Go's useful problem space to be nearly exactly the same as Java and C#, with one notable difference, Go is not controlled by Oracle or Microsoft. I'm not sure how that matters, but it's something.
Re: (Score:2)
That was my impression.
I'm still interested to hear what kind of answer might issue forth from Kernighan and/or Donovan.
A follow up question is, when I'm not constrained by high performance, I have been using Python 2-series. Does go offer something worthy of the effort to move to it there?
Re: (Score:2)
Ah, well that question doesn't have a clear answer from the information given.
Python is a scripting language, Go, not so much. I think Python would have a bit lower footprint in terms of disk space used and memory consumed so it might be a bit faster in a resource constrained environment where a C programmer might find themselves, but for most applications you'd write in Python I doubt there is much of a noticeable difference if you wrote it in Go.
Go is basically useful in the same kinds of use cases whe
Re: (Score:2)
> I think Python would have a bit lower footprint in terms of disk space used and memory consumed so it might be a bit faster in a resource constrained environment where a C programmer might find themselves, but for most applications you'd write in Python I doubt there is much of a noticeable difference if you wrote it in Go.
A Python runtime + all scripts and used modules would consume a lot more diskspace than a Go application. Go might produce pretty big binaries, but on my system, the python2.7 binar
Re: (Score:2)
Again, this is a "use case" question and I said at the start that we didn't have enough information.
If you are just cooking up some small script thing on the fly and python is already built and on your system, python wins. But if you are looking to deploy something in an embedded system with limited resources, getting a already compiled Go program onboard might be better. You will need to "cross compile" that Go program to make it run, but once you have that, it will be smaller than the whole python dist
Re: (Score:2)
That was my impression.
I'm still interested to hear what kind of answer might issue forth from Kernighan and/or Donovan.
A follow up question is, when I'm not constrained by high performance, I have been using Python 2-series. Does go offer something worthy of the effort to move to it there?
Speed and static typing. I do Python for a living (along Java and C/C++), and I dream of using a statically typed language that does some of the Python/Ruby syntatic magic. Go might be one way to do just that (read "might be", not necessarily "is" or "will be").
Re: (Score:2)
If Java is controlled by Oracle then Go is controlled by Google. Neither worries me particularly.
I don't personally see much of a need for Go in my world (high throughput web services), but I know some of the ops folks in my company like it for the stuff they do - and anything which gets more C out of the stack gets my vote :)
Re:I worry about autonomous language activities (Score:5, Informative)
Java is LICENSED by Oracle who doesn't give out the source code... Go is BSD licensed and has source code so you can build your own copy.
Check with Oracle about the terms they use if you want to distribute their Java Virtual Machine in a commercial product. I can assure you it involves you providing them with cash before they will let you even distribute Java, unmodified, as part of your product. I know this from experience. I'll warn you, Java from Oracle does NOT come cheap if you wish to distribute it. Sure they will let you and your customer download it for free, but they want their cut if you download and distribute Java to a customer.
With Go, there will be no such restriction. You can build and distribute Go to your hearts content w/o paying anybody even if you charge for it. You can embed Go in a project, modify it and sell it without having to give up your source code (as I read the license) as long as you leave the BSD license alone.
Re: (Score:3)
Check with Oracle about the terms they use if you want to distribute their Java Virtual Machine in a commercial product. I can assure you it involves you providing them with cash before they will let you even distribute Java, unmodified, as part of your product. I know this from experience. I'll warn you, Java from Oracle does NOT come cheap if you wish to distribute it. Sure they will let you and your customer download it for free, but they want their cut if you download and distribute Java to a customer.
OK, I checked with Oracle, and they said this [java.com]:
Can I distribute Java with my software?
Yes, you can provide Java with your software provided you abide by the terms and conditions of Java binary code license.
Go is great, and there are definitely advantages to Go's BSD licensing model, but this is not one of them :)
Re: (Score:3)
Re: (Score:3)
C has a lot going for it. It's simple, portable, ubiquitous. The language lets you do whatever you want with minimal fuss or overhead. Its generated assembly code is fast and efficient. Because it's the system language of choice for operating systems, nearly every other language can interop with C to some degree. C++ is largely backwards compatible with it. If you want a library to be portable with just about everything else, you write it in C. Great.. awesome so far.
That being said, C requires that
Re:I worry about autonomous language activities (Score:4, Insightful)
If your program runs on a machine which is connected to a network then it's an attack vector, even if it doesn't directly offer network services. Look at the huge number of vulnerabilities in things like file viewers or graphics rendering libraries.
Sure, if you're writing an application which you know will only ever be run on airgapped machines with no removable storage then maybe you can not worry about security. Those applications are few and far between.
Re: (Score:2)
No, they are not. You're just unaware of them. Networks are known to be threat vectors. For many applications, there's no particular benefit to being networked, and considering the risks, it is not uncommon at all to forego the option. We're not talking about your desktop here. We're talking about industrial controllers and the like, of which there are many.
In any case, you are carefully ignoring the fact that I addressed the need for care in a networked environmen
Re:I worry about autonomous language activities (Score:4, Interesting)
Why aren't you writing in assembler? Actually scrub that - how's your microcode? What always amuses me about the bare metal brigade is that they're often not actually that close to the metal.
Different levels of abstraction work for different tasks, and it's always a trade off. Security vs Reliability vs Performance vs Resource Usage vs Developer Time vs Maintainability vs ... you get the picture. Anyone who tells me their tool of choice is appropriate for all tasks is telling me they have a very restricted view of the world. I write mainly in Scala these days but there are plenty of things I wouldn't try to use it for, and I sure as hell wouldn't write my services in C!
Re:I worry about autonomous language activities (Score:4, Interesting)
These statements come from experiences in other languages with obnoxious GCs. This is a performance-focussed language with great multiprocess primitives. The GC causes far less latency.
https://talks.golang.org/2015/... [golang.org]
Pauses average 1ms and will be halved again next release to 1/2000 of a second which is plenty workable for games & audio mixers
Further, intelligently-written code can massively reduce GC frequency.
A certain high-throughput web service I've built runs GC roughly once per hour (yet services 1000s of concurrent requests). And this is without any serious effort at tuning. This is because (unlike Java, Python, and JS) GC is avoided if possible for stack space (whenever provably-safe) which is freed when it leaves scope. The proving algorithms are improving too.
Re: (Score:2)
This.
We use it in very specific places because it works well there (some of our services junctions points) and has excellent concurrency primitives. This lets us overlook the drawbacks that would arise by using it as a general purpose language. I suspect that we use it in the fashion that Google initially intended to use it (they use it much more pervasively now I believe.)
Re: (Score:2)
>> Hi! It looks like you're swearing...
Clippy is that you? Were YOU written in Go?
Re: (Score:2)
Keep bringing up Clippy and, I'm telling you, I'm going to write Clippy for the terminal and get it included in the Linux Base. Don't make me do it. I have gifs and enough source code to copy. I'll make it work with *every* prompt...
$ ls -lah >> foo.txt
(Clippy) Hi! It looks like you're trying to generate a list, would you like some help with that?
There are enough examples so that even *I* can write that. Pfft... Gimme a little and I can package it as a .deb and get it up on launchpad. I then tie it in to systemd and it'll get included by default. Hmm...
$ journalctl
(Clippy) Hi! You're looking for binary error logs? Would you like some help with that?
Clippy touched me in bad pla
C vs Go (Score:3)
Re: (Score:2)
How does 'The Go Programming Language' compare to 'The C Programming Language'?
About as well as Java compares with "C" and in almost exactly the same ways.
Re: (Score:2)
How does 'The Go Programming Language' compare to 'The C Programming Language'?
About as well as Java compares with "C" and in almost exactly the same ways.
That's doing Go a massive disservice; Go differs from Java in very significant ways. To name but a few:
Re: (Score:2)
Being less verbose isn't necessarily a good thing. All it really does is abstract away behind keywords and syntax the complex things that are really going on. Where it's not a bad thing when done well, it does make the language harder to learn and use well. My favorite example is C++ constructors/destructors and variables going in and out of scope in the middle of a statement sometimes, if you don't understand why all this happens, why the compiler hid this activity, you can get yourself into serious tro
Re: (Score:3)
'go' is clearly exactly twice as difficult and complex to write as is 'c' - and there you have it.
Re: (Score:2)
Yes, but that means it's on par with C#.
Why was package versioning left out? (Score:5)
Re:Why was package versioning left out? (Score:4, Informative)
I'd be a Go programmer today except for this. Every major programming platform in use today has a module system to manage dependencies except Go. Go gives you "go get" to haul gobs of source into your tree, after which you get to build and maintain the mess.
The Go folks cop-out and say this problem is one "for the community." Well, it has been six years and "the community" is still schlepping around, making messes with "go get" and inventing bad workarounds for the projects.
Got a plan for this? You should.
Re: (Score:2)
Re: (Score:2)
One of Google's core Go developers addressed this "master" problem at a golang conference some time ago. He said Go developers are expected to keep master clean. Maybe that works inside Google, where employees must adopt the policies of their employer. For the rest of the world this has been a terrible policy; whatever time one is supposed to have saved with simple abstractions and fast compilers is utterly pissed away herding dependencies and fixing breakage due to changing masters.
Builds must be easi
Re: (Score:2)
This is exactly what people need to accept about Golang if they're going to embrace it.
Google was happy to share it, but their desires for Go are primarily aligned with Google's needs - not the community's. It's not personal, it's business.
BTW, enjoy the debugging... ;)
Re: (Score:3)
Geez...
Re: (Score:2)
Because people are bad at writing interfaces. POSIX is an example of a really good interface, how it is implemented on your platform doesn't matter, you use the POSIX library in C, Python etc, it works the same.
In the ideal world, your code would use the interfaces (public functions) and they would be there forever and operate the same regardless of the future versions. In the real world however, things change in libraries from version to version, even bug fix releases may break your code because it got rid
Re: (Score:2)
Got a plan for this? You should.
As a matter of fact they do. Go 1.5 Vendoring experiment [google.com]
Re:Why was package versioning left out? (Score:5, Insightful)
"But go get ... reaches out and..." Stop. go get isn't part of the Go langauge; it's the default Go build environment. And yes, it lacks many features you'd want in a so-called "professional" build system (whatever that means this week).
I get the impression that Go was perhaps intended to be used with repo [android.com], a tool principally used for managing the Android project, but also used elsewhere inside Google to manage large numbers of independent Git repositories. With repo, you establish a common branch or tag name across all the repositories that comprise your project, then "repo sync" to them. Poof! Build and version management. (Sorta.)
Re:Why was package versioning left out? (Score:4, Insightful)
In many languages, building code is a language issue. The fact that Go takes a fairly old-fashioned view of batch compilers and separate build systems is just a choice it makes, not a fundamental part of nature. Furthermore, language issue or not, the question simply becomes why are the commonly used build systems for Go so poor.
Error Handling in Go (Score:5, Interesting)
Go language differs from many other languages in how it handles Errors. Can you summarize the benefits and drawbacks to the Go language error handling approach when compared to Java for large scale applications.
Why an un-googlable name? (Score:3, Insightful)
Seeing as how it was created after the Internet was big, and one is constantly searching the Internet about the programming language one using, wouldn't you want a distinct name so search results are what the programmer wants? "Go" is the 35th most common word in the English language. When you search for "go" you get entries about games, movies, etc. Google, coincidentally gives the best results if the programming language is what you are searching for, but even Google gives you results for all sorts of things. The programming language isn't even a dominant result on other search engines.
Obviously, if you use a search engine to find things about "JavaScript" or "Erlang" you get what you want. I can't imagine going through the trouble of creating a programming language and then failing to give it a distinctive name.
Re: (Score:2, Informative)
Seeing as how it was created after the Internet was big, and one is constantly searching the Internet about the programming language one using, wouldn't you want a distinct name so search results are what the programmer wants? "Go" is the 35th most common word in the English language.
Try searching for "golang".
Re: (Score:3)
Re: (Score:2)
Re: (Score:2)
It was already hard enough to locate new and interesting developments in programming Go, the strategy game. Now it's practically impossible.
But then, who cares about people working on solving some of the most cutting edge AI problems encountered in board gaming.
Re: (Score:2)
The AI programmers are the ones writing the articles. Those searching for them are generally students and interested amateurs. And you are right, they are usually not very good AI programmers, and now they won't become very good AI programmers either.
Usage (Score:4)
Re: (Score:2)
Do: ... functionality are out there and being used in a lot of projects.
- cli tools
- server software, especially stuff offering webservices. Has a mature http(s) server in the stdlib, and there are surprisingly mature libraries with DNS server, SSH server/client,
Don't: GUI stuff, the libraries just aren't there.
Questionable: Web stuff. Ok if you have a static frontend which talks to webservices implemented in Go. Using Go stricly to serve dynamic pages is possible, but I wouldn't recommend it.
Why can't you mark a class with an interface? (Score:4)
I can understand the convenience of not needing to mark a class as an implementer of an interface. But on the other hand, it would be nice if you at least had the option of marking a class as an implementer of an interface, so your IDE could tell you your class is not complete.
Re:Why can't you mark a class with an interface? (Score:4, Informative)
I usually use the following method: https://play.golang.org/p/iF_d... [golang.org] - Attempting to run this will give a compile error. Once you implement MyType.Foo(); it will compile and run successfully.
The only added part is line 10.
Gos potential (Score:5, Insightful)
What serious long-term real-world potential do you see for Go?
How do you see the potential of Go replacing existing open source webstacks such as Apache and PHP, Python or Ruby? Was Go built with a technology update of existing approaches in mind? How feasible is it in your opinion to try and replace the existing complex stacks with pure Go runtimes?
Re: (Score:2)
I think the long-term real-world potential is already showing in the "devops" world, with a lot of new interesting and cool projects being written in Go:
- Docker ... (and pretty much everything else Hashicorp wrote after Vagrant) ...
- Consul, packer, otto, terraform,
- Heka
- InfluxDB
- etcd
- kubernetes
-
I don't think Go will replace webstacks, it's more suitable for backends (with webservices) imho
Official Go IDE? (Score:5, Insightful)
Is there an official cross-plattform Go IDE in the works? Experience shows that adoption is accelerated by offering a solid toolkit that is easy to pick up and get started with - such as the formidable Android Studio IDE Google offers to developers. Are there any plans similar to this for Go?
I would like to see it take the place of C++ in the development of performant end-user applications with GUIs - are there any officially sanctioned projects that aim to provide a serious GUI toolkit and stack based on Go?
Re: (Score:2)
Check out LiteIDE.
Re:Official Go IDE? (Score:4, Informative)
Sorry, was late last night. LiteIDE is a go-centric ide with lots of great hooks for that language. I run it on Linux, OSX and Win10.
https://code.google.com/p/liteide/
Name of the programming language (Score:2)
A large hindrance for seaching information on Go is its name. Many people have pointed this out already.
What plans does the Go project team have in terms of naming conventions to make future searching for information on Go easyer? Is there an alternative term that you recommend using when searching Google for Go related information - perhaps something like the term "go-lang" or so?
What plans does the Go core team have to mitigate this problem? What approach to searching for Go stuff do you recommend right n
Re: (Score:2)
Re: (Score:2)
When you're new to go, one of the first things you learn is searching for "golang" instead of "go" :)
Why should I use Go? (Score:2)
For someone like me who likes garbage collection, multiple dispatch, and extreme abstraction capabilities in high level languages like Common Lisp, and safety, compile-time error detection, readability, and speed in low level languages like Ada or Haskell, what are the benefits of using Go in comparison to these two different types of languages? What new useful features does Go bring?
Re: (Score:3)
The main feature in Go is channels and the light weight threads you can use with them (goroutines). Go is for writing a certain style of concurrent program, and it does not intend to rival Common Lisp in language features. (I'd take ML over Lisp, I think the type inference in ML is a pleasure to use compared to Lisp)
Re: (Score:2)
Perhaps, but I haven't met a C++ implementation that can survive creating as many threads of execution (contexts?) as I can make in Erlang or even Go.
tEoPS (Score:2)
There many books on "how to program" but few on "how to program well". Brian, your book "The Elements of Programming Style" is a wonderful and a classic, but my students have a hard time reading the examples (Fortran 66 and PL/I).
Is there any hope for an update?
Is there any similar modern-language book that you recommend?
Michael Nahas (son of Joe Nahas)
P.S. I totally stole as much as I could from you when writing my tutorial for the language Coq. Sorry/Thanks!
Re: (Score:2)
C's current place in the world (Score:4, Interesting)
PS: Thanks you for co-authoring the most wonderful, perfect, clear and concise technology document ever.
Do you hate go fanboys as much as I do? (Score:3, Funny)
If you were US Secretary of Education... (Score:2)
How and when would you introduce kids to programming?
Go objects (Score:4, Interesting)
Runtime (Score:2)
Any response to articles like this talking about how the runtime is crap?
http://dtrace.org/blogs/wesolo... [dtrace.org]
Re:Runtime (Score:4, Informative)
Safe Performance (Score:2)
Reimplementing the Gnu+Linux toolchain in GoLang could provide safety that decades of eyes on C could not (thinking about the recent BASH bugs & OpenSSL overruns).
Even a small portion would add security to Android. Performance is close & 1.5's library loading should keep executables light.
Is there interest in rebuilding Linux's base userland?
Compiler hack guide (Score:3)
Could the GoLang team produce a walkthrough on enhancing the compiler?
Even something as simple as making the code more idiomatic (since it was translated) could garner huge increases in contributions.
A guide to the structure would also be helpful.
advice for "newbies"? (Score:2)
What would your advice be to people looking for work as a programmer? Either straight out of college with a CS degree, not a CS degree (but a degree), or someone transitioning to it from something else.
The future of Go (Score:4, Insightful)
Now that Go has been in the wild for some time, which parts of the language would you change, and which bits have been an unexpected success?
Are there any plans for Golang version 2, and what might that include?
Re: (Score:2)
Re: (Score:2)
I didn't know who he is and I wont remember tomorrow. Introducing any of these people (badly) is rather pointless. If they were properly linked instead of calling someone a professor and ostensibly leaving out the important bits, there would be no issue. Instead we have an editorial fail. @ slashdot, it's business as usual.
Re: (Score:2)
I'm not sure that that should be at -1. I mean, come on now. We have guests. That means we have certain standards to uphold. One of those standards is letting them see the true /. and, as such, we should probably have the app guy, the cow guy, and APK.
This is where we fling poop and screech like howler monkeys. It's what we do. We shouldn't get out the fancy China, we're just going to break it when they leave.