Fragmented OS

So, the Technical Account Manager for Android at Google came for the department’s seminar session. She’s basically in charge of Google’s relationship with manufacturers that use the Android OS. First off, Google is not the soul creator of Android. It’s actually a creation of the Open Handset Alliance, a group of handset manufacturers, software developers, cell phone service companies, etc.

The Android OS, despite being less than a year and a half old, has fragmented to an appalling degree. Different manufacturers include varied screen sizes, sensors and actuators. So, application developers cannot predict what hardware is available. And consumers cannot easily predict if an application they download will function correctly.

The operating system itself has even become fragmented. There are five different versions of Android available across different hardware. Developers now have to consider these different versions, not unlike working with different browsers. Developing for the latest version (as Google does), effectively tells anyone with an older version (79.6% of the Android market at the moment) that they’re out of luck.

I will note that the speaker suggested using version 1.5 or 1.6 rather than 2.1 in developing. On the one hand, that does solve a short term problem of diverse systems. On the other, it makes an unsafe assumption of developers: that we’d want to use an older specification. For most programming languages, it is better practice and makes a person more employable to use the latest standard whenever possible.

And, there are some genuine reasons for this fragmentation. With more varied hardware, it becomes increasingly difficult to include the appropriate drivers (needing to write one for every new feature for every individual piece of hardware). Some devices do not contain the memory or processing to be upgraded, which effectively keeps them trapped with their original version.

It’s this fragmentation that will eventually lead to different flavors of the Android OS, more or less defeating the purpose of a unified operating system. Manufacturers may want to consider having an easy Lego-like means of upgrading hardware, but that still does not account for building the drivers (and assumes that manufacturers would even want open hardware).

Ah well. It was a nice idea.

Data Structures

I’m grading for the data structures course this semester. The prof has never taught the course and is reusing assignments from a previous professor’s version of the coursework.

I spent Monday sick and grading. (I did not receive the assignments to grade until after the department grade-by due date and had to rush.)

Grading is a very disheartening. The purpose of the assignment was to demonstrate using a queue. Prof said they could use more advanced data structures. The students did not comprehend they were to still follow the queue requirements (enqueue, dequeue, limited access, etc.).

Out of 70 students only 1 included a queue, reused from recitation. About 20 had included Java’s queue (many of which preceded to use a secondary data structure to do the actual work). The rest used another data structure altogether to reach the same effect: ArrayLists to LinkedLists to HashMaps to trees.

For people that are not familiar with a queue, this is among one of the simplest data structures to implement. It implements a First In, First Out (FIFO) means of accessing data. One can only access the first (or “top”) Object in the queue; all other contents are inaccessible.

… I don’t understand the drive of these students to use more complex data structures (and code design) than is necessary. A queue uses notably less memory and has a faster access time these other data structures.

I read comments that a hash table is more efficient than a queue. Queues have constant time adds (enqueues) and removals (dequeues). A hash table has O(1 + k/n), where k is the number of keys and n is the number of elements; this is between linear and logarithmic time scales (meaning the amount of time to perform an add or removal will increase with an increase in the size of data structure).

This scares me. There will be (if there aren’t already) computer scientists and programmers making inefficient code because they genuinely believe their way is better.

… I talked to the prof in charge (who has been out of town this week) about my issues. My actual boss, the Director of Mentoring and Retention, had spoken to him previously about this. (I was actually third to complain about it to her.) And she was not getting through to him; she was even considering going to the department chair.

After I told the prof what had transpired, the light bulb finally went on for him. Students will not prove they understand concepts unless they are forced to. Getting the right answer is more important than learning, I guess.

Brand Me

My first years at university, I was a journalism advertising major. So, the inevitable question is how does one go from that to computer science?

As a journalism major, it became quickly obvious that journalism (at least in the United States) has fallen quite far on the integrity scale. Today, it has gotten even worse. While The Daily Show, a comedy program, employs a full time fact checker, news organizations will employ one perhaps part time. Most mass media is owned by one of five megacorporations. Megacorporations that have other assets to promote and a profit-oriented view.

So, I decided if I were to be evil, I just as well be honest about it. So, I switched to advertising. I really enjoyed the topic, particularly the discussions of intersections and media interactions. I love being creative and creating stories, which is the foundation of the creative area of advertising (as opposed to branding). My profs were great.

But, my peers were a different story. I really did not have any thing in common with them. Even with advertising, I don’t want to just watch the ads. Advertising needs to earn my attention. And most did not seem to look past the surface while creating; to sell something you need to get in the mindset of the market.

At this point, I stepped back and considered what I wanted and what had drawn me to advertising. It was telling stories. It was swapping my viewpoint with that of someone completely different; learning about socio-economic and cultural aspects of others. And there is something appealing about convincing someone that you have something that will genuinely make their life better.

I decided I wanted to make the things that would be worthwhile. These things that advertising could be honest. And technology is where the world is innovating. So, engineering or computer science? Computer science just felt more right to me.

The world is becoming ambient advertising. Even journalism, traditionally viewed as objective, has an angle; what new pandemic, book, sports team am I being sold now? Buses, sidewalks, television, movies, textbooks… all are subtly trying to sell me something.

Let’s say it’s a free, open source tool. Alternative tools (which may have equal features) won’t be mentioned. And rarely, they’ll give me a reason why I need X feature. No one is even being paid in these cases.

Word of mouth is the most effective and cheapest advertising medium available. It’s people that like your product or service to talk about it to others that trust this person’s judgement.

People even advertise themselves: public versus private personas. And there may be more than one. What language do you use with children? Coworkers? Friends? Family? Doubt it’s the same across all of them. (I’d certainly get in trouble if my thoughts always got to my mouth.)

Then, there’s the question of labels that are used. Despite building little embedded and alternative interface systems, I’m not about to call myself a “maker,” “hobbyist,” or “engineer.” These terms conjure images that I do not associate with even if they could be correct.

… So, if the whole world is one big advertisement, how do you brand a person. First, we need to consider what branding is. No, not the kind involving a hot iron. Branding is an idea that is painted onto a commodity. Owning a Mac does not make a person creative. A sports car does not guarantee a fast (possibly reckless) driver. Having lung cancer doesn’t mean the person is a smoker and deserved it. All computers, cars, and cancers are more or less the same. Yet, we associate these things with social messages.

So how do people brand? Well, I’ve been building the brand that is Alison since I came into existence. It’s not that I am creating one from scratch: I am just continuing my branding. (Think of Disney. When was that not about family entertainment?)

While it is possible to rebrand a person, that’s increasingly difficult. A doctor isn’t going to become a shoe salesman easily. So, think on what you have and how to sell that. Let’s try dissecting me:

  • Person (I prefer human-first labeling)
    • Humor: Dry, sarcastic, and dark with occasional bad puns
    • Morals: Emphasizes integrity and being honest with oneself about immoral behavior
    • Animal lover: has pets and buys humane animal products
    • Creative: paints, writes, and creates projects
  • Computer scientist
    • Mixed advanced courses: diverse CS interests
    • Diversity work: wants equal opportunities for everyone
    • Tutor: knows material to be able to teach

That’s a very basic one. I could go into being female, a person with a disability (with its subgroups), middle class, European-American, older child, being raised in diverse locations, enjoying Asian foods, being dairy-free etc. What of me is worth selling? Well, as with selling anything, it depends on who I’m selling to.

Missing Something

Upon graduation, I will become medically uninsured. And that scares the shit out of me. My medical record more or less indicates that the inside of my head is a mess of pain and disorganization.

What if a new insurance will not cover my preventative medications? Do I pay out of pocket or do I succumb to constant pain? What if I develop a new condition? Does that count as “preexisting” and not covered?

Last election, it seemed that the US had voted for health care reform. But then the cries of “it’s socialism” came.

This entire situation pisses me off. There are so many things wrong with it.

First off, medical coverage in this country is classist. Not everyone can afford adequate health care. And with classism, comes our dear friends racism, sexism, and ableism; certain people are more likely to be poor.

Second, the Congress people that vote against coverage get top-notch taxpayer provided health care. I don’t know why no one seems to think this is relevant. The people that make the decisions for everyone else already have single-payer health care. Can this be revoked? People voting it down and proclaiming its evil must not want it for themselves. Right? Right?

I need a third party to be viable. Mostly because the Democrats do not fight for their convictions (or at least the ones they claimed to have). Alternatively, I could try running for a government position rather than lying down and accepting this bullshit.

Third, why does everyone pick on socialism? It’s socialist to have:

  • Public access and maintenance of roads.
  • A postal service.
  • Public education.
  • Consumer protection regulations on food, medications, etc.

I’m personally a fan of all of these services and more. (Who wants rat burgers?) Socialism accepts that people do not start at equal starting points, but works to allow equal opportunities for everyone.

JUnit

JUnit is a unit testing framework developed for Java programs. It’s not my favorite thing in the world. For starters, it only tests public methods. Which is a bit of a problem if from a development standpoint; many internal “heavy lifting” methods are not needed by outside classes and should be private. In addition, I cannot use Eclipse, my IDE, to debug as I do with other code.

For my software engineering course, I am creating a very simple Roman to Arabic numeral converter. (If anyone knows what the unicode character for Roman numeral 5000, a V with a line over it, I would appreciate it for accuracy.) It isn’t the converter program that is important. The purpose is to demonstrate black box testing methodologies: testing without knowledge of the internals of a program.

I developed a test plan and wrote the test cases in JUnit, as instructed, before proceeding on to writing the actual converter. I then ran my tests. A couple failed and a hand full had an error. I rewrote the code; the class is small enough to justify it, rather than worry about where my sometimes failing  bug was.

Yet, I still had the same problems. So, I copied the short bits of code into a main() function to use the debugger. The debugger revealed no faults: my system produced the correct output. JUnit had produced a false negative. I didn’t know it could even do that. It did not occur across similar tests with identical assert statements, so I’m not sure what it could be.