Lately, I've come to the conclusion that I'd like a wristwatch with a slide rule bezel. I've spent plenty of time playing with slide rules so I'm pretty proficient with their use. Having one on my wrist would be nice.
I would like some more screen real-estate, though. A 7-inch tablet just doesn't cut it for me, and my eyes are too old to handle uber-high-resolution on a small screen.
Ubuntu already has the tiling window manager, but Android and iPad do not. And the voice recognition stuff is using desktop equipment. Yes, tablets are getting very interesting but they aren't ready to replace the desktop just yet. Another 12-18 months, though, you may be right.
Do you really need to use a keyboard to programming?
If you're using a smartphone or a tablet, which has an accelerometer, you could tilt the device to navigate around in your program.
Many years ago, some researchers at IBM came up with a design for an on-screen keyboard. They analyzed the QWERTY keyboard, the FITALY keyboard and a couple others, determining how fast someone could type on them. QWERTY scored lower than any other, around 30 wpm. Their keyboard scored > 40 wpm.
Details can be found here
Also, most computers can be booted from a Linux Live CD, hit the VM and let me do what I want to do without actually installing anything on said computer. So, if I'm visiting my dad, who's running Windoze, I can still play with my VM.
Finally, using VirtualBox to run WinXP to VPN into the office, on a host machine running Linux, works quite well. If you want to check something on the Internet WITHOUT the VPN trying to route it through the company's proxy server, fire up the browser directly on the host machine, outside of the VM. If you want to hit stuff on the company network, fire up the browser inside the VM.
I foresee a day when more and more people are doing the latter one. Any virus infections on the host machine will have to be very intelligent to infect the VM, and vice versa. And, heaven help you if you ever end up in a situation where you need to log onto multiple VPNs at the same time. Different VMs, different VPNs, one host to rule them all.
A while back, I was looking at a forum where someone asked if you'd use a tablet to do computer programming. Most of the responses were centered around "typing is slow/awkward on a tablet."
I agree. Typing is awkward. But, who says programming has to equal lots of typing? Yes, it does, currently. But does it have to?
A little social engineering goes a long way.
Much of my CompSci degree involved writing assignments in C++. Until I took a class where it was all Scheme. And another where I had to write my assignments in Java. We didn't have classes in these languages. We were simply expected to "pick them up" if we were going to complete our assignments.
The CIS majors were spending multiple semesters learning the finer points of Visual Basic. Yes, this is a few years ago
I suggested, at my current gig, that we have a certain task produce output in XML, then use XSL stylesheets to convert that to the outputs for various target platforms. One of the non-CompSci guys, who had never had a class involving push-down automata and regular grammars, whined about "XSL is hard!" It may be if you've never had the aforementioned class, but if you already understand conceptual things like regular grammars, XSL isn't that hard.
A CompSci degree will not teach you everything you need to do any particular job. It will, however, give you the tools to keep up with the constantly-evolving world of programming, whether the target output is HTML, or a green-screen app or a native, mobile app. Or whatever is the going thing a decade from now.
Cases with built-in solar cells. I want to be able to lay it on my desk (upside down is fine) or on the dash of my car on a sunny day and have the battery recover.
The ability for an app to change the device's USB profile:
- You can get apps which will let you use your smartphone as a touchpad, but you have to run some kind of software on the other machine. I want the ability to fire up an app on my smartphone or tablet, while plugged into another machine's USB port for battery charging, and have the other machine see a USB connected mouse/touchpad without needing to install any specialized software.
- Ditto for keyboard. I want to be able to use my smartphone's/tablet's voice recognition while connected to a desktop/laptop machine and have the connected machine think that I'm just typing really fast.
- Ditto for audio input/ouput. I have a headset which connects to my smartphone; why should I have to have another one for my PC/laptop? Again, no special software required on the connected desktop/laptop machine.
The ability to set proxy server settings on a connection-by-connection basis. If I'm on my home wifi network, I have a caching proxy in place to reduce bandwidth usage and accelerate access. If I'm elsewhere, I don't want to try hitting that proxy server. Just add that to the wifi profile and get on with it. Neither Android nor any version of Linux I've used manages to get this right.
Array microphones on the device. I want to be able to lay my smartphone/tablet face-down on an table during a meeting and, not only record the voices clearly, but be able to map out, after the fact, who was sitting where and have the recording annotated with who said what. Can't even get an add-on device which can do this.
I spent 4 years in Uncle Sam's Air Farce. I lived in a dormitory, not a tent. I slept on a bed, not on a cot. I handled an M-16 a whopping total of 4 days of those 4 years. I spent those 4 years working on fighter jets (F-16, to be more specific) and was able to pass the exams for an FAA Airframe Mechanic's License when I got out.
I used my VA benefits to pay for expenses while I finished off a B.S. CompSci, after I got out.
Finished college over a decade ago. Making plenty more than I would've if I'd stayed in, or had never finished college.
If I'd joined the Army, I would've spent more time in a tent, more time on a cot, more time eating really lousy food. Just because I served my country doesn't mean I felt the need to do it the hard way.
My job involves lots of coding in Java, with occasional excursions into SQL and RPG. Lots of HTML and CSS, as well. We make heavy use of Hibernate, which reduces the amount of actual SQL we have to touch.
I despise Java. The core language is very weak, so you have to have significant numbers of external libraries added in to accomplish anything. This results in a very large, complex API which no one can hope to learn the ins-and-outs of. You actually need something like Eclipse or NetBeans, where the editor can look at what you've entered and suggest methods, based on context. It really doesn't help when you tell the system you need a "List" of something, and it needs help figuring out which of the "List" classes to use.
Prior to this gig, I've coded largely with vim (no, I'm not trying to start a vi - emacs flamewar). I used the word completion functions but, otherwise, the code flowed from my fingers into the editor with relatively little input from the editor. Once I got "in the zone," I could code for hours at a time and accomplish a great deal. These Java-based editors need you to stop while it thinks about what to propose, which breaks the flow. I never, ever, get "in the zone" with Eclipse. And, due to the breadth of the libraries and the different classes and methods, I've never been able to code Java, effectively, with vim.
Add in the fact that everyone wants to tie in all these frameworks which abstract stuff away, many of which are built on "convention over configuration." This results in a lot of programmers who are little more than technological "sorcerer's apprentices," copying-and-pasting stuff from one project to the next because, well, that worked in the last project and they really have no clue HOW it works; this project needs to do something similar so, hopefully, it will work in this one, too.
On a recent project, I requested assistance from the most experienced Hibernate guy in the place. Something I was trying to do wasn't working. After digging around in it for a half hour, he told me I'd just have to dig into the documentation and figure it out because he had no clue why it wasn't behaving. Oh, and when I figured it, let him know what finally worked. The most experienced Hibernate guy was, in the end, just another "sorcerer's apprentice," who didn't really comprehend the "magic" he was wielding.
I'm not happy with being a "sorcerer's apprentice," but I don't have time to dig through the piles and piles of code which constitute the multiple layers of stuff we're building on. Expecially when you consider the fact that each of the layers are evolving, and we may replace the library in this layer with a completely different one in six months.
I don't have any kind words for RPG, either. It's a legacy language which predates widespread use of SQL. Some of the code I'm dealing with has been in production for two decades, back when the company was all green-screen apps and no intranet. The beancounters who run corporations don't want you ripping out piles of old stuff and replacing it; that old stuff has been in use for years, has been thoroughly tested and debugged. Who cares if it's hard to read and maintain? Who cares if the original developer, the only person who ever knew how it worked, retired years ago? It works! Modify it if you absolutely must, but don't replace it. Oh, and expect a s**tstorm if your modifications end up breaking something.
A year ago, I was wondering if I was getting too old for programming work. I loathed my job. Why do I put up with that place? Because there are precious few options in this town, I'm not in a position to relocate, I still need an income and that pays better than most jobs in this area. So, I put my head down and kept plowing along. Wondering how hard it would be to get a prescription for anti-depressants.
My most recent project has allowed me "stretch my legs" a bit, in the user experience design area, and to tackle a lot of jQuery. While it took some doing to wrap my head around jQuery, I'm finding I enjoy it immensely. It's not as limited as Java and RPG. And being able to make the browser do all kinds of nifty stuff is very gratifying.
If not cut or outsourced it will, at the very least, be disrespected.
Prior gig: lead developer for a small, struggling AaaS company.
Current gig: intranet web developer for a Fortune 500.
The current gig pays better. The prior gig didn't pay enough to pay the bills; I'd still be there if it did.
I really miss doing web dev for a web-based company. I was the creator of products, the generator of wealth. The bottom line was enhanced directly by coming up with something faster, better designed, more efficient. If it took a little longer to get that new feature out there, they could live with that because the resulting app was better for the extra time spent on it. They didn't pay well but at least there was some respect because I made visible contributions to the company's bottom line.
Here, I'm a cost center. No respect. Aren't you done yet? I don't care if that design would work better; I've got your next six projects lined up and you're pushing them all back because this one isn't done yet. No, you don't have time to do major surgery on that hideously-screwed-up app; slap another band-aid on it and get on with this other one. We don't have time for that. No raise this year because you didn't meet all of your (arbitrary, management-assigned) goals. We've got interns who are producing more than you (the intern doesn't have to support/fix the crap they cranked out; I do).
I've been here almost 4 years. Once a few family commitments are completed, I am blowing this area. And you can bet my next gig won't be a "cost center."
3G data is unacceptable for most interactive IT work on the net.
I live in a rural area in southern Missouri. I used to use WildBlue (satellite) and found that to be painful for SSH, RDP and VNC. The bandwidth wasn't the problem; the latency was. For stuff like that, I found that connecting my cellphone (1X-CDMA/2G connectivity at that time) worked well for that. It had lower latency (similar to a dial-up modem) and, while it had less bandwidth than WildBlue, it had enough.
When they upgraded the local tower to 3G, I dropped WildBlue; I have been using 3G for my home connectivity for a couple years.
There are only two situations where I've found 2G or 3G to be particularly limiting:
1) RDP/VNC is painful when I am running an uber-high resolution display. 1920x1200 (I love my 24" Samsung) doesn't work so well through that because that's a LOT of pixels to push. Scale the window down to 1024x768 and 3G works quite well with RDP. Just don't try to watch video through it. TightVNC is more bandwidth-efficient, so you can go with larger windows. X Windows, over SSH, is frequently even MORE bandwidth efficient, because you're just sending one window's contents through the connection instead of the entire desktop.
2) I have to do a BIG download/upload. For the uploads, I have a cloud server ($11-12/month) and I use rsync. By kicking rsync into action multiple times during the course of a long dev project, I push lots of small "deltas" up to the cloud server. Because these are small, they go pretty quickly, even with limited bandwidth. When I need to do a major deploy, it deploys from the cloud server which has BOATLOADS of bandwidth. I have, on occasion, pulled down tons of code from a client's machine to the cloud server, then fired up a TightVNC session to the cloud server (through SSH) and did my analysis and editing. If you know what you're doing, you can bypass TightVNC and run the apps on the cloud server, but interact with them on your machine (X Windows is really good for this). In that case, I'm avoiding the download entirely.
Once upon a time, I used SSH and LBXProxy to remote into an ISP, where I worked, and drive my Windows-based workstation from a laptop and a 28.8 connection. Linux is actually better for making use of low-bandwidth connectivity than Windows.
Ideally, we'd have 4G, without bandwidth caps, everywhere in the country. With a little bit of technological knowledge, though, I do just fine with considerably less.
If you do not have a decent grounding in set theory, please do NOT attempt to do any significant database work.
Basic select, insert, update and delete can be dealt with via modern ORMs. Anything beyond that, such as joins, intersections, unions etc. are almost entirely set theory. Where is that covered in the traditional mathematics curriculum?
Yes, some ORMs purport to do that stuff, too, but they rarely do it well.
True story: I was taking a database course as part of my college education. The professor introduced us to relational theory, including an algebraic notation which described subsets of fields in a record and subsets of records in a table. Then, over the course of three class periods later in the semester, he taught us SQL. It boiled down to "this is how you do xxx in SQL." From that, we got table creation/destruction, selects, views, subqueries, aliased fields and tables, inner and outer joins, the whole enchilada. I've been able to build on that and do some pretty heavy-duty SQL work but I had to know the underlying theory. Being subsequently trained in RPG, where much of the legacy code does NOT use SQL (and you invariably don't have time to replace it with code which does), that theory comes in very handy.
We understood the underlying theory, all expressed via math. Learning SQL was a simple matter of learning how to express our desires in a language the computer could understand.
You need at least algebra to understand O(n) notation. Without that, you're usually stuck either cluelessly gluing together someone else's libraries (a LOT of that in modern SoftwareDev) or continually recreating O(n^3) (or worse) algorithms.
If you aren't going to learn calculus, one can only hope you never need to do any kind of Numerical Analysis. Any course where you're allowed to use Mathematica, because the calculus (such as taking the third or fourth derivative of a function) is "overhead" relative to the material being covered, is the very definition of "heavy duty." And, since physics is largely the application of calculus, avoiding calculus means you also need to avoid anything which involves physics. Stuff like game design (Angry Birds uses plenty, Angry Birds In Space uses more), putting rovers on Mars, wireless network design (wave propagation between obstacles and through different media is very calculus intensive); you know, the COOL stuff.
For the typical web developer, creating shiny web pages which do extremely simplistic database work, you probably won't need calculus. Ever. Is that all you ever aspire to be? And how long can you continue to do that without being crowded out by graphics design wizards with increasingly intelligent design tools?