it – Sheep Guarding Llama https://sheepguardingllama.com Scott Alan Miller :: A Life Online Fri, 05 Dec 2008 16:33:49 +0000 en-US hourly 1 https://wordpress.org/?v=6.9.1 Robert Dewar on Java (and College) https://sheepguardingllama.com/2008/08/robert-dewar-on-java-and-college/ https://sheepguardingllama.com/2008/08/robert-dewar-on-java-and-college/#respond Mon, 04 Aug 2008 23:43:10 +0000 http://www.sheepguardingllama.com/?p=2478 Continue reading "Robert Dewar on Java (and College)"

]]>
Two recent interviews with Prof. Robert Dewar of NYU, Who Killed the Software Engineer and The ‘Anti-Java’ Professor, have recently been popular on the web and I wanted to add my own commentary to the situation.  These interviews arise from Dewar’s article in the Software Technology Support Center: Computer Science Education: Where are the Software Engineers of Tomorrow? As someone who takes his role on a university computer science / computer information systems professional review board very seriously, I have spent much time considering these very questions.

Firstly, Prof. Dewar is hardly alone in his opinion that Java, as an indicator of the decline of computer science education in America, is destroying America’s software engineering profession.  The most popular example of someone with similar opinions would, of course, be the ubiquitous Joel Spolsky (of Joel on Software fame) in his Guerrilla Guide to Interviewing or in Stack Overflow Episode 2.

The bottom line in these arguments is not against Java but about the way in which colleges and universities teach computer science.  Computer Science is an extremely difficult discipline, but universities will often substitute simple classes for core CS classes.  Dewar states that this is widely because enrollment has dropped off in these programs as the field is less attractive and students choose lower-hanging educational fruit.  Universities put pressure on the departments to increase enrollment, often by lowering standards and eliminating hard requirements.  However, difficult programming classes like deep C or Assembler, require more highly trained, and therefore expensive, resources so this too causes academia to avoid teaching such categories.  A trained C or C++ developer has much better compensation prospects in the “real world” than they do in academia.

Java itself is a great language and no one, in this case, is saying that Java is not or should not be popular in real world development.  But Java is a language designed for rapid software creation and includes a staggering amount of built in libraries.  Almost anything truly difficult has been addressed by Sun’s own highly skilled developers already and does not require reworking by a working developer.  Working with Java requires only a rudimentary knowledge of programming.  This, by its very nature, makes using Java as a learning environment a crutch.  Learning to program in Java is far too easy and many, perhaps most, programming concepts can be easily avoided or perhaps missed accidentally.  (Anything that I can say here could apply to C# as well.  Both are great languages but extremely poor for teaching computer science.)

Far too often university computer science programs teach no language but Java.  Computer science students need many things including deeper system knowledge and a more widespread knowledge of different languages.  Computer science programs need to stop focusing on single, limited skill sets and start teaching the field of CS, and students need to stop accepting the easy way out and demand that their schools live up to the needs of the workplace!

While, by and large, I agree with Dewar whole-heartedly, he does have one comment that I find very disturbing – although very unlikely to be wrong.  He mentions, in more than one place, that Java is inappropriate as a “first language” as if computer science students at NYU and other universities are learning their first programming languages in college! This is an incredibly scary thought.

I guarantee that international students looking at careers in software engineering or computer science wouldn’t think of entering university without a substantial background in programming.  I can’t imagine a school like NYU ever considering such a case.  If we are allowing the entrance bar to be set so low than can we even possibly consider what we teach when apparently it matters very little?  Would we accept college students who didn’t do algebra in high school?  Didn’t speak English?  Know no history?  Failed physics?  How then could we possibly consider allowing non-programmers into what should be one of the most difficult possible collegiate programs available, and how can we expect good, proficient programming students to learn something of value when forced to learn alongside new learners?

Dewar’s argument for the necessity of a higher standard of collegiate computer science education is that by dumbing down the curriculum and handing out meaningless degrees to anyone willing to pay for them (hasn’t this been my argument against the university system all along?) we are fooling outselves into believing that we are training tomorrow’s workforce when, instead, we are simply accelerating the rate of globalization as developing countries see a massive opportunity to invest in core disciplines and outpace the United States at breakneck pace.  Software development is a field with very little localization barrier inherent to the work and is a prime candidate for offshoring due to the nature of the work and the advanced communications commonly associated with its practitioners and the higher level of skills generally present in its management.  But by created a gap in the American education system we are making a situation occur that simply begs to be globalized as our own country is mostly unable to produce qualified candidates.

Lacking from many discussions about computer science curriculum is the need to discuss the range of IT curricula in programs such as IT and Computer Information Systems.  Computer Science is a very specific and very intense field of study – or so it is intended.  Only a very small percentage of Information Technology professionals should be considering a degree program in CS.  This is not the program for administrators, managers, network engineers, analysts, database administrators, web designers, etc.  Even a large number of programmers should be seriously considering other educational avenues rather than computer science.

There is a fundamental difference in the type of programming that a comp sci graduate is trained to perform compared to a CIS graduate, for example.  CIS programs, even those targetting programming, are not designed around “system programming” but are generally focussed around more business oriented systems often included web platforms, client side applications, etc.  CS is designed to turn out algorithm specialists, operating system programs, database programmers – the kind of professionals that companies like Microsoft, Oracle and Google need in droves but not the type that the 300 seat firm around the corner needs or has any idea what to do with.  Those firms need CIS grads with a grasp of business essentials, platform knowledge and the ability to make good user interfaces rapidly.  These are very different job descriptions and the best people from either discipline may be pretty useless at the other.

All of this points to the obvious issue that companies need to start thinking about what it means to higher college graduates.  If all but a few collegiate programs are allowing CS programs to be nothing more than a few advanced high school classes in Java – why are we even looking at college degrees in the highering process?  Highering practices need to be addressed to stop blindly taking university degrees as having some intrinsic value.  We are in an era where the universities are wearing the emporer’s new clothes.  Everyone knows that the degrees are valueless but no one is willing to say it.  The system depends on it.  Too many people have invested too much time and money to admit now that nothing is being taught and that students leaving many university programs are nothing more than four or five years behind their high school friends who went straight to work and developed a lifelong ability to learn and advance rather than to drink beer while standing on their heads and spent their parents’ or borrowed money.

Computer Science departs need to start by developing a culture of self respect.  Teaching Java is not bad but a CS grad should have, perhaps, one class in Java and/or C# not a curriculum based around it.  Knowledge of leading industry languages like Java is important so that students have some feel for real world development but a CS degree is not preparing many students for work in Java based application development but for systems programming which is almost exclusively in C, C++ or Objective-C.

]]>
https://sheepguardingllama.com/2008/08/robert-dewar-on-java-and-college/feed/ 0
Singleton Pattern in Java https://sheepguardingllama.com/2008/05/singleton-pattern-in-java/ https://sheepguardingllama.com/2008/05/singleton-pattern-in-java/#comments Fri, 09 May 2008 18:58:02 +0000 http://www.sheepguardingllama.com/?p=2369 Continue reading "Singleton Pattern in Java"

]]>
Implementing a Singleton Class Pattern in Java is a common and easy task. The Singleton Pattern (as definied by the Gang of Four in 1995) is to “ensure a class only has one instance, and provide a global point of access to it.”

The idea behind the Singleton pattern is that there can only be one unique object of the class in existence at any one time. To make this possible we must make the constructor private and instead create a public getInstance() method that controls access to the constructor, returning a new object if none exists or returning the already instantiated object if one does. We must also override the clone() method from the Object superclass as this oft forgotten method will provide a workaround to our Singleton protection.

Here we have an example of the simplest possible Singleton class which I call, Singleton. It has only those methods absolutely necessary for the pattern and one console print statement in the constructor so that we can easily see when the constructor is called.

Singleton.java

public class Singleton {
     private static Singleton instance;
     private Singleton() {
          System.out.println("Singleton Constructor Called");
     }
     public static synchronized Singleton getInstance() {
          if (instance == null)
               instance = new Singleton();
          return instance;
     }
     public Object clone() throws CloneNotSupportedException {
          throw new CloneNotSupportedException();
     }
}

Now that we have a working Singleton class we need to make a simple test harness to see how we can call it and how it behaves. In our test we will simply create two objects, mySingleton and myOtherSingleton and we will see when the constructor method is called.

TestSingleton.java

public class TestSingleton {
        public static void main (String[] args) {
                System.out.print("Calling First Instance: ");
                Singleton mySingleton = Singleton.getInstance();
                System.out.print("Attempting to Call Again: ");
                Singleton myOtherSingleton = Singleton.getInstance();
        }
}

Hopefully this will help you write quick and easy Singleton pattern classes in the future.

See also: Sheep Guarding Llama Singleton Pattern in C#

]]>
https://sheepguardingllama.com/2008/05/singleton-pattern-in-java/feed/ 1
Do IT: Information Technology Career Paths https://sheepguardingllama.com/2007/04/do-it-information-technology-career-paths/ https://sheepguardingllama.com/2007/04/do-it-information-technology-career-paths/#respond Mon, 02 Apr 2007 22:22:43 +0000 http://www.sheepguardingllama.com/?p=1838 Continue reading "Do IT: Information Technology Career Paths"

]]>
Information Technology is a very large field but within the field there are common job categories and career paths. Over time new careers appear and a few old careers fall away and within broad career paths there are many areas of specialization. This article’s focus is to look at the large, broad categories to give new IT professionals or IT hopefuls a basic grasp of options within the field.

The categories here are separated by duty and represent the basic building blocks of the IT professions and disciplines. By no means is this meant to be representative of all job roles and career paths available to an aspiring IT professional or hobbyist but to provide some structure to make target careers less ephemeral. In the real world few, if any, IT professionals do the work of only a single job role without venturing outside its strict boundaries if such boundaries can even be argued to exist. In extremely large IT departments (those over 10,000 IT professionals) will often stick very strictly to descriptions such as these but small departments (say of only 10 IT professionals) may lump almost all skills into just two or three overarching job descriptions.

Programming: Of all professional areas within Information Technology the area of programming is surely the most well known to people outside of the profession. Programmers can work in numerous different technology areas, specialize in many different ways and can work with many different languages and platforms. Programming is often the area of IT that draws people into the field. Programming, more than any other IT discipline, is easy for people to begin learning early and is very accessible.

Programming, or coding, involves the writing of computer programs which can range quite significantly and job titles vary dramatically as the job descriptions begin to differ. Beginning professionals on the programming path are often just termed “programmers” and can expect to do programming projects that involve tiny pieces of larger systems. Programmers are almost always working on teams of programmers but can potentially live very solitary existences if such is desired. Programming professions allow for a very wide array of working environments. Programmers are more well suited to working flexible hours and from remote locations or “work from home” due to the nature of many programming projects.

As programmers progress along their career paths they can move up to positions like software developer, software engineer and software architect. Specialization within the programming realm can include system programming (working close to the hardware – highly technical), user interface programming (working closer to the end user experience – generally less technical and more creative and involved in the “human element”), database programmer, web application programmer, etc. Programming fields lend themselves to crossing into software design and management roles as well.

Systems Analysis and Design: Programmers may write software but systems analysts design it. Often the two roles are combined in what is called a “programmer analyst” as the roles are so closely identified. A systems analyst’s role is to define requirements and high level design for an application or program. Programmers are responsible with the low level design. A good analyst will have a very good understanding of programming, developer’s tools, architecture and more. It is a broad discipline that often involves a lot of customer or client interaction and the ability to translate requirements from clients outside of the IT field into useful requirements for design and for the programmers.

Systems Analysis is almost a management discipline and analysts will often cross that boundary many times during their careers. It is an exceedingly creative part of the IT field requiring a lot of critical thinking and “outside the box” contemplation skills.

Project Management: Any area of IT can have project management involved with it but this almost always applies to software project management or system project management. IT departments that include any number or programmers and possibly analysts will logically be charged with developing software. Project Managers oversee this process. Technical project management is generally closer to being a management discipline than an IT discipline but many PMs are highly technical and come from the core IT ranks as IT project management is so varied and different from project management in other areas such as engineering.

Hardware Support: Hardware support comes in two basic flavours – desktop hardware (which includes laptops and other commodity end user items) and server or datacenter support. Hardware techs range from consumer desktop support personnel that you will encounter at stores like CompUSA and BestBuy to server technicians working in the datacenters working with multi-million dollar hardware. the range is rather broad. Because desktop hardware has become so commonly known the “computer store” techs are generally not considered to be IT professionals any more than a car salesman would be considered a mechanic or a car designer. Sometimes a store tech job can provide leverage into the field but generally this is not the case. The technologies that are used in consumer PCs is enough different from enterprise business systems that the skills are generally not useful across the divide.

Some large companies maintain a staff of hardware technicians who work on desktop and laptop level hardware. Desktop class technicians are so identified with the CompTIA A+ certification that often times these job roles may be termed “A+ Techs”. This is generally a path towards the server technician positions. Server technicians need to be familiar with much more complicated and varied hardware and often work in large datacenters where there is little or no direct customer interactions. While desktop techs often interact to some degree with end users and desktop support technicians, server technicians generally interface only with systems administrators.

Networking: One of the core skill areas in IT is networking and communications. Networking is a relatively new discipline within the industry as computers used to exist primarily as stand-alone devices whether in homes or in business. But over the last few decades the idea of computers that are not a part of a larger network has gone from commonplace to practically unthinkable. Today even the most basic home computer is purchased to be an Internet connection node and not for the innate capabilities of the computer itself. Because of this networking has exploded into a very large, core discipline needing many qualified professional to fill out its ranks. Networking jobs generally fall into a few basic categories: network technician, network administrator and network engineer.

As you can guess from the job role names a technician’s general role is to deal with mostly “field” networking issues which often involves a lot of leg work, is more likely than other positions to place you in a remote office and often involves working with smaller categories of networking equipment but it is a stepping stone to high level networking positions. The network administrator is the position responsible for managing and running the day to day operations of the corporate network. Generally the network administrator is the last word in the company’s network operations. This can be a very senior position and while the job titles are few the discipline’s long term career growth is solid. A network engineer’s job would be to design a network. Often administrators and engineers are the same people but in large companies these roles are separated with engineers generally having a broader knowledge of network solutions and vendors and administrators having a more thorough knowledge of low level tuning and configuration of the equipment used at that time.

Systems: Possibly the largest of all IT disciplines is that of systems. The concept of systems is so large that it is difficult to define in any meaningful way and is often conceptualized as several sub-disciplines to make it easier to quantify. The basics are that the “systems discipline” involves any basic management of computer “systems”. This can mean management of end-user resources like desktops, laptops, PDAs, etc. as well as shared resources like servers. Generally a “systems” professional will work primarily with the computer’s operating system but this qualification is hazy at best. Any real work systems professional will have much overlap with other areas but core functionalities are generally more well defined.

Desktop and Deskside Support: The most common sub-discipline within systems is desktop support. This role is very difficult to separate from that of “Helpdesk” although the later is less of a distinct discipline but more of a delivery method of support. Most businesses separate helpdesk into a unified function that crosses many discipline boundaries.

Desktop Support involves the direct management of personal computers whether they are Windows, Mac, Linux, etc. A desktop technician will often work either directly with an end-users workstation or remotely via remote control technologies to help keep workstation resources working correctly, adding new software, etc. Desktop administration often deals with large numbers of desktop resources and generally handles password and account issues, large scale desktop changes, migrations, etc.

While desktop job descriptions are generally rather lean the field is actually extremely large. Almost every business requires a regular host of support personnel to keep the non-IT staff working on a day to day basis and will additionally utilize contract desktop support staff to augment internal resources as often “project” work will require far more people than a company can normally keep on staff. Many IT professionals who intend to enter almost any of the other disciplines will start their careers in the desktop support realm as it has the lowest “barrier to entry” into the field. But don’t be fooled. Just because it is easy to get into the beginning desktop support ranks there are many long term career opportunities within this field as well. Many professionals have long and rewarding careers without even leaving the desktop support arena.

In some large organizations there might even be a dedicated desktop engineering role specifically for those function of designing the operating system and application profile for corporate desktops. This position is almost always included in other job roles but can, potentially, exist on its own.

Server Administration and Engineering: The most visible and well known career path under the systems umbrella is that of server administration and its nature sibling, server engineering. These roles are so common that almost all businesses simply refer to them as system administration and system engineering.

Server support roles are involved with the designing, building (from a software perspective,) securing, deploying and managing the server resources of an organization. These servers come in a wide variety of types from Windows, Linux and Netware operating systems to application, database, web and email functions. Server support is a very large job role category that often spans entire careers from intern to retirement. This is one of the largest senior level career categories and is often a “target” career for people entering the IT field.

Pure server support roles as can be found in very large companies may be very strictly limited to supporting just the operating system and core functionality of a server. More often server system administrators will be involved in the running of extended functionality such as email, web, database and other software that is tied to the server.

Application Support: In large organizations when the system support role is strictly limited to the server’s operating system you will find dedicated application support personnel who generally specialize in a single application (such as Microsoft Exchange) or in a category of applications (such as Email) or in a suite of applications (such as Microsoft BackOffice including applications like Exchange, SharePoint, LiveCommunications Server, Project Server, etc.) More often you will find mixed server and application specialist who specialize on a particular platform and application combination such as iPlanet on Solaris or Apache on Linux, etc. Management Information Systems applications such as Enterprise Resource Planning (ERP) or Customer Resource Management (CRM) are common dedicated application areas as well.

Many companies have myriad internal applications that have been developed or customized either in house or through a consulting agreement and are considered to be a competitive advantage for the organization. These unique applications often require support as would any commercially purchased off the shelf application. In addition to the obvious role of application administration the role of application support is also common in large corporate entities. This is often called “operations” as this role functions almost as an organizational nerve center.

Database Administration: Known as a DBA, a database administrator is a special category of application administrator that is dedicated to the database technologies. Databases (such as Microsoft SQL Server, Oracle, Sybase, MySQL, PostgreSQL, etc.) are such a critical, popular, important and unique application that the field is considered to be its own area. There are many skills unique to the DBA profession that are not used or not widely used outside of database administration.

Database Designer: In a role somewhat related to both systems analysis and programming is that of database designer. A database designer’s job role is to work with application designers and analysts to design the database portion of an application. Databases are extremely complex types of software that generally require careful management and tuning and individual databases require detailed design which can be a significant portion of the design of an application.

Web Designer: Unlike the web application developer which is a popular programming job role a web designer fulfills the very popular function of designing web pages themselves. This is often considered to be a fringe IT job role because it is equally related to publishing, marketing and other, non-IT disciplines but because a truly qualified web designer needs a to be very skilled technically it is, in my opinion, a true IT discipline. Web designers get probably more opportunity for artistic creativity than any other IT activity. Often web designers will slowly more into programming to enhance their skill sets and will begin to become user interface specialized web application developers. But the leap from non-programming web design to web application development is a large one not to be undertaken casually. It is truly a change of discipline but between two disciplines that are closely tied together. Web design is by far the most prominent IT discipline to make use of traditional artistic abilities.

Security: While almost every job role needs to make security a part of their own discipline the enterprise has a place for overarching security personnel as well. IT, because of its ties to the company’s most valuable non-people assets – data, is integrally tied to security. The role permeates the field and is broad in its implications. Security professionals must be aware of everything from physical security, system security, network security, database security, programming methods, etc. In today’s IT professional realm security has become an extremely hot topic and it is very likely to remain so indefinitely.

Help Desk: This task is often placed in its own category because of the nature of the position. Help desk generally refers to the job role of the technical support call center. Help desk roles generally range from customer application support to remote desktop support. A help desk and an operations center will often be paired together or combined into one entity. Using current remote desktop management technologies such as RDP the modern helpdesk has taken on many of the job functions previously covered by deskside support. As networks become more stable and power powerful and as desktop management becomes more ubiquitous and far reaching the abilities for the help desk to cover most day to day support functions increases. Often the helpdesk is used as an aggregation resource to provide a single point of contact for any needs originating from an non-IT end user.

LAN Administration: This mostly deprecated term was once popular for referring to the small and medium business combined job role of deskside and server administrator along with network technician. LAN Administrators were often required to be “jack of all trades” functioning as a single point of resolution for all “computer” problems in small businesses. Often this meant constant trips to user’s desks and wrangling with tiny mixed user server and network closets. As IT advances this role is becoming less popular but is likely to continue in smaller companies for some time. The term LAN refers to the “Local Area Network” and was meant to suggest that the administrator was responsible for all machines connected to and including the office’s network. LAN Administrators also have a tendency to occur at remote, branch office locations where a single person can satisfy almost all local IT needs and additional needs can be handled via helpdesk or remote administration.

Storage Administration: One of the newest professional areas now widely available as a specialty within IT is that of storage management.  Over the last several years new and highly specific storage technologies have emerged and have become a mainstay in the corporate technology environment.  These technologies are, to some degree, unique to storage dealing with large and fast storage hardware as well as network technologies adapted for dedicated use in the storage space.  Storage results in generally being a blend of systems, networking and a little server level hardware support.  This is a young and growing area within IT but definitely here to stay.

]]>
https://sheepguardingllama.com/2007/04/do-it-information-technology-career-paths/feed/ 0