Cross Codes Blog





Blog home





Introduction to Wireshark dissectors

15 May 2018 | Engineering

I've been given several tasks involving computer networks. A good tool I've been using is Wireshark, a packet sniffing software. This software detects a chosen interface to capture packets from and displays the capture information in columns, decoded packet information, and raw data. Columns can be added and customized. A user can decode packets as specific protocols. Raw data can be viewed as hex or binary. The GUI looks like the following:



What I will be talking about in this blog post is how to create a custom packet detail as seen from the image. The packet detail is created based on a dissector typically written in Lua which I will be using for this tutorial. The dissector is to conform with how the packet is decoded given the protocol and will decode the payload of a packet to be decoded under that protocol. Dissected output will show in packet detail. Anything that is not dissected will be displayed as raw data.

Writing the Lua script:
For Wireshark to detect your Lua scripts, they will need to be stored in the "plugins" directory of Wireshark. In Linux, you can find ".wireshark" in the home directory and for Windows in "%appdata%". The first thing to do is to create a protocol using the Lua function Proto. This function takes a string of the protocol name and a string of its description. Call the dissector function on the protocol which takes in the packet buffer, information, and tree as parameters which I will explain soon. We then need to add the port using Dissector.get followed by mapping it with the protocol using add. See the more detailed example below:

-- create a protocol
trivial_proto = Proto("trivial", "Trivial Protocol")

-- create the dissector function
-- @param: buffer = space in packet to decode;
           pinfo = packet info;
           tree = container of buffer and info

function trivial_proto.dissector(buffer, pinfo, tree)
   -- print name of protocol in its column
   pinfo.cols.protocol = "TRIVIAL"
   -- add sub payload into tree
   local subtree = tree:add(trivial_proto, buffer(), "Trivial Protocol Data")
   -- code for dissector goes here
end

-- create table of ports to catch packets from
udp_table = DissectorTable.get("udp.port")
-- register protocol to table
udp_table:add(7777, trivial_proto)


The above code simply creates a protocol, assumes it comes from port 7777, and decodes accordingly. To understand how dissection works, we need to look at the parameters I mentioned earlier:
buffer - space allocated specified by bytes where dissection will take place
pinfo - fields displayed in the columns in Wireshark; above example uses the "protocol" field
tree - protocol section in packet detail; "subtree" is a subsection within the trivial protocol area

The packet dissection process will be heavily reliant on the buffer and output the decoded packet in the tree to be displayed in the packet detail in Wireshark. "pinfo" is a field you can use to print specific information about the packet being dissected. To dissect the raw data, the typical functions to use are:
uint() - converts buffer area to numerical output; must be called when outputting bytes
bitfield(starting_bit, number_bits_to_dissect) - dissects specific bits while converting to numerical output; must not exceed buffer

These functions are called on the buffer object (parameters are starting byte and how many bytes to go through) that itself takes in numerical parameters to highlight which bytes are dissected in raw data. I personally haven't figured out how to highlight bits that are not byte aligned. If you figure this out, I would love to hear about it here. If you need to make use of information outside of the dissection buffer, you can retrieve that data with Field.new("field.name"). Below is an example protocol called "Trivial" and a code snippet for its dissection:

Trivial
Starting bit
Bit size
Data
0
15
Trivial descriptor (Constant value)
15
1
Variable Data present flag
16 with Variable Data
8
Bit size of Variable Data
16 without Variable Data
24 with Variable Data
8
Fixed Data
32 with Variable Data
varying size
Variable Data


-- code for dissector goes here
if buffer(0, 2):bitfield(0, 15) == TRIVIAL_DESCRIPTOR then
   -- routine with variable data
   if buffer(0, 2):bitfield(15, 1) == 1 then
      local bit_size = buffer(2,1):uint()
      subtree:add(buffer(3, 1), "Fixed Data: " .. buffer(3, 1):uint())
      subtree:add(buffer(4, (bit_size / 8) + 1), "Variable Data: " ..
      buffer(4, (bit_size / 8) + 1):bitfield(32, bit_size))
   -- routine without variable data
   else
      subtree:add(buffer(2, 1), "Fixed Data: " .. buffer(2, 1):uint())
   endif
endif


Adding core dump:
If you are planning to record packets for several hours, a neat feature to add is core dump. This is simply giving your dissector the ability to spit the dissection in a .csv file to be opened in a spreadsheet. This is useful for looking at specific behaviors by values displayed in Excel format. The only concept I am adding here is implementing file I/O in Lua. You may find the following functions useful:
io.open(file_name,mode) - open a file given by the string name
file_name:close() - close the file; end file I/O with this call
file_name:read() - read file contents
file_name_write(content) - write contents to file

List of file opening modes:
"r" - read-only; also default mode
"w" - write to file by overriding existing content
"a" - append to the file
"r+" - read and write
"w+" - read and write and overwrite existing file
"a" - append and read





Implementing DHCP on Junos

29 April 2018 | Engineering

In this blog post, I will present a tutorial on how to implement a DHCP server on a Juniper firewall using its built-in Junos operating system. If you haven't done so yet, please read my blog post on Juniper operating system as this blog post builds up on that topic. You will need to access the configure mode of Junos for this tutorial. Before we begin implementing the server, let's talk about what DHCP is. DHCP stands for Dynamic Host Configuration Protocol. It is used in a computer network to assign IP addresses to devices connected to the server. To understand this, think of an individual computer in a networked system as a client. When the client has been configured to request an IP address, it will send a DHCP packet across the network assuming there is a DHCP server present. This packet is the client saying "hello I need an IP address". It will keep this up continuously until a DHCP server receives the request and sends the client an IP address. The server will need to know the mac address of the client in order to know where the request came from to assign accordingly. It is also possible to obtain specific IP addresses using a static IP lookup table that maps to given mac addresses. In this case, the server will look into this table to see if the mac address it received a DHCP packet from is mapped to a specific IP address that is needed. Otherwise, an IP pool (range of usable IP addresses) will be looked into and one that is available will be assigned to the device assuming that the IP pool has been properly configured. It is important to note that incorrectly configured IP addresses can result in network errors so please choose your assignable IP addresses wisely. The packet looks like the following:



When configuring a DHCP server in Junos, things you need are the IP pool, the lease time, and optionally a static IP table if you plan to assign specific IP addresses to specific devices. In configure mode, you will need to enter the following commands:

# enable a specific port for DHCP
set interfaces ge-0/0/2 unit 0 family inet address 192.168.2.1/24
# map interface to a group
set system services dhcp-local-server group g1 interface ge-0/0/2.0
# set IP pools low and high
set access address-assignment pool p1 family inet network 192.168.2.0/24
set access address-assignment pool p1 family inet range r1 low 192.168.2.2
set access address-assignment pool p1 family inet range r1 high 192.168.2.254
# set lease time and specify IP of DHCP
set access address-assignment pool p1 family inet dhcp-attributes maximum-lease-time 2419200
set access address-assignment pool p1 family inet dhcp-attributes name-server 192.168.10.2
# optionally create static IP table for specific address assignments
set system services static-binding 01:03:05:07:09:0B fixed-address 192.168.2.50


Your config file should look like the following:

pool p1 {
   family inet {
      network 192.168.2.0/24;
         range r1 {
            low 192.168.2.2;
            high 192.168.2.254;
         }
         dhcp-attributes {
            maximum-lease-time 2419200;
            name-server {
               192.168.10.2;
            }
         }
      }
   }
}


Be sure to commit your configurations. You can also verify that DHCP is configured using the following commands in operational mode to see if you get the corresponding output:

show dhcp server binding
IP Address    Hardware Address    Type       Lease expires at
30.1.1.20     00:12:1e:a9:7b:81   dynamic    2007-05-11 11:14:43 PDT

show dhcp server binding address detail
   IP address          192.0.2.2
   Hardware address    00:a0:12:00:13:02
   Pool                192.0.2.0/24
   Interface fe-0/0/0, relayed by 192.0.2.200

Lease information:
   Type                DHCP
   Obtained at         2004-05-02 13:01:42 PDT
   Expires at          2004-05-03 13:01:42 PDT
   State               active

DHCP options:
   Name: name-server, Value: { 6.6.6.6, 6.6.6.7 }
   Name: domain-name, Value: mydomain.tld
   Code: 32, Type: ip-address, Value: 192.0.2.33

show dhcp server statistics
Packets dropped:
   Total 0

Messages received:
   BOOTREQUEST         45
   DHCPDECLINE         0
   DHCPDISCOVER        1
   DHCPINFORM          39
   DHCPRELEASE         0
   DHCPREQUEST         5
   DHCPLEASEQUERY      0
   DHCPBULKLEASEQUERY  0

Messages sent:
   BOOTREPLY           6
   DHCPOFFER           1
   DHCPACK             3
   DHCPNAK             2
   DHCPFORCERENEW      0
   DHCPLEASEUNASSIGNED 0
   DHCPLEASEUNKNOWN    0
   DHCPLEASEACTIVE     0
   DHCPLEASEQUERYDONE  0


Note that you can also configure DHCP in J-Web under "DHCP Server" or directly edit the config file. To check whether DHCP is actually assigning IP addreses, plug in a computer with its IP set to auto and check to see if it aquires in IP address.





NVIDIA crashing on Linux

2 April 2018 | Technical

I am currently using Linux mint which is based off of Ubuntu. After about three years of owning my Alienware 17 R2, I noticed my laptop would randomly power off at times getting more consistent over a couple weeks of use. It eventually got to the point where my laptop became unusable. I thought it was a software issue at first until I noticed the same problem after booting from a flash drive. From here, I diagnosed the temperature, battery, RAM, and GPU in that order. Temperature was normal. The laptop would still power off when plugged in so the battery was not the issue. Normally I would not even be able to boot into the OS if RAM was an issue so I skipped this. This left me with the GPU which turned out to be the problem. Also, another hint was that this was happening significantly more often in Linux than Windows (The reason for this will be discussed later). At the meantime, I believed there was something wrong with the NVIDIA GTX GPU that came with the laptop unfortunately soldered onto the mobo making replacement inefficient. To verify this, I ran extensive graphics tests involving playing HD videos for hours with only Intel HD graphics enabled. Interestingly, the laptop managed to stay on for days unless the battery died. When I switched back to NVIDIA, the laptop powered off right away leading to my confirmation of this being a graphics related issue. For my solution, I simply opened Device Manager on Windows and disabled NVIDIA. For Linux, I made sure NVIDIA was running through Driver Manager which originally wasn't making me unable to configure the card. Nonetheless, it was still enabled acting as a possible culprit for the crash. I installed Nvidia Prime to be able to select which graphics card to run. The commands work as follows:

sudo prime-select intel # enable Intel GPU
sudo prime-select nvidia # enable NVIDIA GPU
sudo prime-select query # verify which GPU is enabled


I noticed that on the task bar in Linux, I can see the icon of the GPU that is currently running which requires logging out and back in for changes to be applied. I also noticed that running NVIDIA would cause Linux Mint to run in fallback mode. In conclusion, I thought simply disabling NVIDIA fixed the problem which appeared to be the case. It turns out that it was a software problem all along, specifically with the Nouveau driver that Linux uses with NVIDIA. After doing some research, I stumbled upon the command inxi -G used to output system hardware status with the 'G' flag to specify graphics. I was presented with the following output:

Graphics: Card-1: Intel 4th Gen Core Processor Integrated Graphics Controller
          Card-2: NVIDIA GM204M [GeForce GTX 970M]
          Display Server: X.Org 1.18.4 drivers: intel (unloaded: fbdev,vesa) FAILED: nouveau
          Resolution: 1920x1080@60.02hz
          GLX Renderer: Mesa DRI Intel Haswell
          Mobile GLX Version: 3.0 Mesa 11.2.0


Notice the "FAILED: nouveau" line. I believed this changed how I should approach this problem. I ran NVIDIA once more but this time ran the proprietary driver for NVIDIA in Driver Manager rather than Nouveau. I ran my graphics tests again with NVIDIA enabled and Nouveau disabled. Miraculously, my laptop stayed on for days running these tests. I tried the same for Windows after enabling this configuration on Linux and got the same results. When I ran the "inxi" command on Linux, the failure was gone. I mentioned the issue to a friend who is more experienced in hardware and he happened to know about Nouveau and was adamant in assuring me that it's a terrible driver. Looks like the problem was solved. Lesson, DO NOT use Nouveau. Use Nvidia Prime.

In case you have this problem, here are the steps to rectify it:
1. Install Nvidia Prime via sudo apt install nvidia-prime.
2. Open Driver manager. You can also use the command driver-manager.
3. Make sure to enable the proprietary driver for NVIDIA and not Nouveau.
4. Type inxi -G to verify that Nouveau is no longer failing or even enabled.





Dual booting a Windows machine

14 March 2018 | Technical

I can personally say that dual booting pretty much saved my life as a computer science student at UCSD having UNIX forced down my throat; not that it's a bad thing. As a programmer, you will need to know how to use the UNIX command line. Typically, students rely on ssh to access their Linux accounts. This has proven to be unreliable to me in a handful of times where connectivity was bad or the server had too many students logged on, normally during an assignment deadline. Also, since you need to know UNIX, why not have a copy of Linux handy on your machine? Today, I present a tutorial on how to dual boot your Windows computer.

What you will need:
Flash drive with enough space
Universal USB installer
One of the following ISO files:
Ubuntu ISO file
Lubuntu ISO file
Xubuntu ISO file
Kubuntu ISO file
Mint ISO file
**You can use whatever ISO file you want, these are just the one's that I know work for this tutorial.**
Your Windows computer (if you don't already have it)

If you already have Windows installed, then you're already half way there. If not, you will need to obtain an ISO file for Windows. Simply plug in your flash drive to a computer and drag the Windows ISO file to it. Again, make sure you actually have enough space to do this. Different OS's have different space requirements. Go head and run Universal USB installer once you've downloaded it. It's very straight forward. Select your flash drive by letter, your ISO file, and the appropriate OS from the list. Be sure to have the format hard drive option unchecked unless you want to delete everything from it prior to your installation. This process takes about 2-5 minutes. When it's finished, you will notice that your flash drive label has been changed to UUI. When you open it, you will notice all the boot files. It is important you do not modify the locations of any files otherwise, it will not work. Your boot loader looks for the files in your flash drive's root directory. Reboot your computer with the flash drive plugged in. Check your BIOS to see whether you have the boot priority set to find your flash drive. You should then see the setup manager for the Windows installation. Follow directions and be sure to install Windows in an available partition in your hard drive. All you have to do is go through the wizard. When finished, you should have Windows installed on your computer and should be able to boot into it once you remove your flash drive and reboot your machine. Notice, whenever you need to reformat your Windows partition, you basically have a rescue disk in your flash drive assuming you have backed up all your personal data. I recommend creating a folder in your flash drive and storing all the boot files in there. Whenever you need to install Windows again, simply copy all the files back to the root directory. You will do the same exact procedure to install Linux. If all goes well, you should see the Grub instead of Windows boot manager with a list of all your OS's every time you boot your machine. Typically, Windows must be installed first for this to work. You now have a dual booting machine with Linux natively installed. You also have rescue disks for both of your OS's.

Steps summary:
Step 1: Acquire the materials listed above.
Step 2: Install the ISO file to the flash drive with UUI.
Step 3: Reboot your machine with your flash drive plugged in. Check your BIOS if you need to configure your boot priorities.
Step 4: Go through the installation wizard.





Juniper operating system

13 March 2018 | Engineering

I have recently been tasked with learning how to use the Juniper operating system (Junos). I was given a device called a Juniper Firewall SRX-3OO. To put it simply, this device is a glorified switch that is meant to act like a firewall and can be configured into a server. In addition, this device differs from a traditional switch with its security policies. There are two ways to manage this device. The traditional way is through the CLI (Junos). The practical way is through a web interface referred to as J-Web. Both ways are similar in functionality and both possess the pros and cons between working with a CLI and GUI. One thing to note is that Junos is a networking OS. It reads from a config file that determines how it behaves. This config file is set from the factory and can be edited by the user. Modifying this file is typically the source of work with this OS.

CLI Mode:
There are 3 modes in Junos. The first mode is your typical UNIX command line which I have not done much work in. If I learn a significant implementation that uses this mode, I will be sure to post about it in a later blog post. The other 2 modes are operational, accessed using the cli command, and configuration accessed using the configure command from operational mode. A lot of my work is done in configuration mode. This is where we are editing the config file. A generic example of this config file looks as follows:

field {
   subfield1 {
      subfield2 {
      ## subfieldN Note comments are made using ##
         value {
            1;
         }
      }
   }
}


The config file is arranged in a hierarchy that is recursively traversed. To change or remove a value, we use the set and delete commands respectively. Respective examples include set field subfield1 subfield2 value 2 and delete field subfield1 subfield2 value 2. The commands are also recursively parsed to check for syntax and whether a field exists in the config file. You can use the question mark (?) character to see an option of available commands. Tab shortcuts also apply which you will need because the hierarchical nature of the config file results in significantly long commands. You can also see the current parameters set using the show command. Things that run in operational mode will require run show in configuration mode such as dhcp-local-server statistics for example. To see the value 1 set in the example file, the command is show field subfield1 subfield2 value. If this were an operational task, the run command will need to be affixed. In operational mode however, it is not needed. You can also change what heiarchy you are in to shorten your commands. For example, after entering edit field subfield1 subfield 2 you can simply enter the command set value 2 since you are in that hierarchy level. To go a level up, use the exit command. In configure mode, after setting desired parameters, the commit command is required for the configuration to become operational. The commit check command checks to see whether the configurations are valid without committing them. This mode is accessible via serial connection.

J-Web:
From here, you can simply edit the config file in edit mode without having to enter the commands. A view mode is also available to see the config file in read only mode. There are also specific features located in the interface that can be used to configure a setting such as dhcp. Editing such settings automatically edits the config file. Committing then is made with a press of a button. This mode is accessible via Ethernet connection with the default IP of 192.168.1.1 like most routers. You must configure the IP address of the Ethernet port to a .1 network or .x for a 192.168.x.1 address. Here's a video on using the J-Web interface:

If the video is broken, please let me know here.

This is the bare basics of Junos. I will likely be posting more advanced techniques and specific Junos related tutorials in the future. Click here for the Juniper website to learn more. Take a look at Implementing DHCP on Junos if you came from there.





Five recruiters one question

28 Februrary 2018 | Industry

During the 2018 Winter Triton Career fair, I had the opportunity to show 5 companies my blog and get their approval on posting their responses to about their hiring process. I hope the following information serves any help to any aspiring engineers. Good luck with your job searches!

Question: When looking for candidate employees to hire post interview, what do you look for?

App Folio: The primary thing I personally look for is the background technical knowledge the applicant has in his/ her arsenal. This is the primary but not everything. In other words, if this is lacking, it's most likely a rejection. The knowledge I'm talking about are CS fundamentals such as data structures and algorithms. The next thing I look for are any projects they have done outside of school. This shows me that the applicant is interested in what he/ she is doing and willing to take it outside the scope of their schooling. School related major projects are good but outside of school is a plus. I'm not necessarily looking for any particular set of skills. Our framework is written on Ruby on Rails and me myself never used this before I started working for App Folio. However, one's background knowledge and experience outside of school shows me their learning potential that they can contribute to the company. Lastly, I look for individuals who are excellent problem solvers and more importantly, those who can communicate effectively; get their point across accurately and clearly.

Stemonix: As for technical skills, I look for one's ability to learn new technology and specifically how well they can design. When it comes to education, those with a higher level background are always preferred. But more importantly, I look for what they can design and how good they are at what they do relative to their level education. I look for critical thinkers, those who are efficient, and those who can learn fast given what their technical background has to offer them. Even though higher levels of education are preferred, I really care more about how they can harness what they have to offer. However, the more important side is their attitude. I look up to individuals who have the character of a good employee. This involves their punctuality, organization, work ethic, presentability, and how well they can communicate. The technical side is moreover a tool to get the job done but what really makes a good employee is HOW they work regardless of what technical knowledge they have to offer.

Synopsys: In university, technical background is extremely emphasized and if one can get through the educational rigor their university has to offer without cheating, those are means to an end. A weakness in this mindset is the lack of emphasis in one's soft skills. If I can find a candidate who has excellent soft skills, they will stand out in the talent pool given the addition of the necessary background knowledge to perform their jobs. What I look for is a candidate's ability to communicate effectively and firmly, work well with a team, talk to strangers, offer good customer service, and present well. The technical skills are only a means to an end however, it's the soft skills that will land one a job especially in Silicon Valley. A good candidate would be memorable. This is one who can effectively argue their points and still get along with a team, have good social skills, and be able to present or lecture confidently with the ability to design good power points to back up those presentations. Overall, it is the character that determines who will land the position. The technical background is just a filter for those who have potential.

Aetna: You need to be an excellent communicator. I cannot stress this enough. We get a lot of applicants who have a lot of technical skills to show off but not enough people skills. When it comes to technical skills, showing that one can use their technical background is a way for one to sell themselves in their interview. However, I didn't know what I know now in terms of technical skills before working at Aetna. The act of selling one's self, their ability to SHOW that they can perform the job given their technical background, that's a people skill. I like to see those who are aggressive yet approachable in addition to having the rudimentary technical qualifications. While the technical qualifications are also a factor, the determining factor is one's ability to communicate given their technical background.

Cubic: Communication communication communication! This is what's very important aside of the technical skills. Regardless of whether a candidate is technically qualified, what a good employee has distinction in is their ability to communicate as they are working in order to be productive and produce a favorable work environment. I love questions. One's ability to openly and urgently ask questions shows their interest and urgency to solve their problems. At Cubic, there is only one stupid question and that is the one that isn't asked. The three values I look for in a good applicant is their urgency to produce good work, their openness to communicate, ask questions, and take initiative, and their ability to take ownership for their work and coming up with original and clever ways to do what needs to be done to meet a deadline. Anything technical can be learned on the job but good work is presented in one who can communicate it, not necessarily their technical background. The technical aspect is just the candidate's toolbox that can be expanded with good communication skills. It is also important to note that what will also impress your interviewer is your knowledge on the software development models since these concepts are heavily used in the industry. Technical skills will not make one stand out as much as having the soft skills to back it up. The technical skills just get your foot in the door.

From what I see, although technical skills are important, they are only a means of getting into the hiring process. Typically, an applicant will have a vast set of skills but will not perfectly match the set of skills the company needs. These skills however can be learned on the job and what determines how well a candidate can learn these skills is not just their technical background, but the addition of their work ethic displayed by how well they can communicate. There are several engineers out there with distinct technical skills. What makes one memorable on top of their technical skills set is their ability to communicate effectively. It is an act of selling what one has to work with that can foreshadow how well they will work on a team given a qualified technical background.

Links to the provided companies
App Folio
Stemonix
Sysnopsys
Aetna
Cubic





SD Hacks experience

17 January 2018 | Experience

This was my very first hackathon experience and quite an eventful one, much more than what I expected. To start off, my impression of these events lies on one far end of the spectrum of whether one can appreciate this event as being a rather eventful challenge for highly aspiring engineers or feeling just about the opposite way strongly. For me, I saw it as a challenge in terms of time and expected innovation, and opportunity on the count of the networking chances and a vast array of hacks. I definitely took advantage of the networking opportunities gaining insight from multiple companies and exchanging ideas as well as offering my resume and professional online persona. I also took advantage of an API from Twilio in the hack that my team came up with. From the networking opportunities to the handed challenge of coming up with a hack that can become innovative, I also saw this experience as a convention for many engineers to collaborate and exchange ideas from within a medium that everyone can gain more knowledge from each other. Of course, the crown jewel of this event was cranking out 2 all-nighters coming up with an innovative idea given ideas, hardware, and even open source code provided by companies. I surely gained an idea, technical skills, and stamina from this event. Best of all, my team won the grand prize for our implementation of an IoT smart fridge.

View project





Resume growth and socio-economic entitlement

15 January 2018 | Industry

I would like to take part of this blog post to give a shout out to one of my favorite authors before I address my point he influenced, Daniel Quinn.
Click here for bio

I have also laid out below some of his works that serve as references for this blog post.


What I am about to explain is a theory that is not necessarily accurate nor is it by any means proven to be true. Capitalism, or some like to call it, a means of opportunity; as implied by "opportunity", there are those that achieve it while there are as those who are exploited by it. A generic example to clarify this would be any competitive game, one that features a winner and a loser. That being said, capitalism has those whom are victorious and those who must work to make it up to victory. In a nutshell, to keep an economy that features free opportunity to socio-economic gain stable, there must be spenders in order to make capitalistic gain possible for the winners of the game. How does college play a role in this kind of society? It is actually more of an economic buffer than a provider of industrial competencies. Generally, we only use 20% of what we learn in school as an application. After 13 years of school, one can only recall a handful of concepts but still competently live their life. For example, out of math, the only means we use as an application are mathematical operations. From science, we indirectly use the scientific method. We learn some language just enough to the point of useful communication. Specifically, as a CS student in college, one can theoretically get by in the industry as a software engineer with a decent knowledge in some programming languages, algorithms, and soft skills. Essentially, this can be achieved in a year rather than 4. One may argue that only those basic skills alone won't make one marketable. I will get to that later but theoretically, one can do the job of a software engineer with those basic skills while the rest are only specific applications that one either happens to know or can be looked up whenever needed. Why do we spend all this time in school possessing a poor ratio of learned to applied concepts with what we study? One theory is economic stability. It is designed for a group of people, typically the younger ones, to be encouraged to spend money which will keep the economy moving and beneficial for those earning money. In capitalism, there must be spenders that gainers benefit from. This explains why society encourages an extended amount of time for the youth to be in school and is independent of whether these individuals can win in the capitalistic nature of the economy by being industrially qualified. In other words, a lot of the college degree is a rite of passage, the proof that one has spent their dues in school funds and is eligible for a role in the economy to finally make a good salary. To answer the argument that only knowing a limited amount of skills regardless of being applicable, will not make one a likely candidate for a job, this is an example of how the capitalistic economy urges one to spend money before landing a role in the economy that makes money. Although one's schooling and degree may have some significance in learning how to become industrially competent, that is only a limited part of it. The other part is maintaining economic stability by urging people to contribute money before being paid to contribute to society. Whether I completely agree with this theory is outside of my intentions of this blog post.

The next thing I would like to discuss is an example that may assess this theory by explaining how my resume has evolved over time. To clarify, I will not be talking about how my resume got better in terms of its content moreover, I will be focusing on how my resume changed as I spent more tuition money to earn my right into a software engineering job. The point I would like to make is the increment in my social title suggested by my resume based on a quantity of dollars that I contributed to a capitalistic economy. Below are links to iterations of my resume tantamount to my time and money spent in education:

See resume 1
Tuition money spent: $0.00
   - a lot of buffer content to fill one page (ie. objective, addresses)
   - soft skills with description to fill space
   - no employment; masked with "Professional Experience"
   - only containing volunteer work and extracurriculars
   - awards only have to do with high school accomplishments
   - extracurricular activities is a section
   - references is a section

See resume 2
Tuition money spent: $27827.78
   - professional summary added as an improvement from objective
   - list of technical skills without applications
   - employment present
   - professional organizations present
   - contains basic projects

See resume 3
Tuition money spent: $35201.63
   - professional summary removed to make space
   - more content and technical applications in professional history
   - list of skills with applications
   - removed references section to make space

See resume 4
Tuition money spent: $49131.65
   - contains hyperlinks
   - removed fast food job
   - added internship experience
   - removed irrelevant certifications
   - projects are more large scale and specific
   - format of skills changed to make space

The trend I see here is that over time, I have been able to remove insignificant concepts from my resume to make space for more relevant and larger scale experiences as I invest more time and money towards my degree. Once again, I would like to thank Daniel Quinn for this idea.





The study of Computer Science

12 January 2018 | Experience

The study of computer science is defined by the scientific approach to answer the problems of computation, the way that computers solve problems. Normally, one would expect this degree to lead them to a software engineering career however, the main take away I would like to point out is that software engineering is only one out of many specific branches of computer science, one which is highly marketable in the industry. While one's expectation in a nutshell is that a CS degree leads to a six-figure career, one must understand that this is not the case GENERALLY speaking of the field of computer science. I will discuss from my experience what this field of study actually is in a general sense rather than it being associated to a high paying job. As I have noted earlier, computer science is a scientific mean of computation. That is to say, the scientific method is actually used to solve the problem of how to compute. Formerly, I misconstrued why this was considered science but back then, my only experience at the time was coding, only one out of many aspects of computer science. When taking part in this field of study, one should expect three main branches of computation. That is software, hardware, and theory. The most obvious branch is software, anything that has to do with code and abstraction. This where I felt I missed the understanding of this field being a science. Coding is more of an application or toolbox to actively address a problem of computation. How does the code actually work in a physical level? That brings me to the branch of hardware, particularly digital design. This focuses on how to physically create the CPU to be programmed to solve computable problems. This branch focuses on how to use signals on and off for a computer to physically execute what the code tells it to do. How has all of this been figured out to this day? This brings me to the theoretical branch of computer science. Every idea is a theory until proven and put into practice. The theory branch is where most of the science exists. It attempts to answer computation questions; what is solvable, how to solve it, and how efficient it can be. A lot of algorithms and their efficiencies is studied in this branch as well as a lot of hypothesis being tested. The theory of computation addresses computing models to attempt to solve problems before the machine is built (hardware) and code is given to it to put the solution into practice (software). All together, we have the field of computer science.





University vs. industry

9 January 2018 | Experience

I have always had this burning question before I got into the industry. With CS being a rather abstract field of study, what does one actually do in the work force with all the abstract concepts in mind? First of all, I would like to make very clear that EVERYTHING one does in their course work is vital to their career. While some aspect in college may be directly or indirectly beneficial, every task is tied to each other and builds on itself. Any curriculum is built in its own unique way to educate aspiring engineers through time, addressing specific goals. To answer the question of what happens in the industry, expect projects as far as the eye can see to come under way, as well as the expectation of teamwork to accomplish large scale projects. Whether it is a basic application, some back-end database, or complicated network system, a CS degree's worth of skills to be used as one's toolbox is more than enough to answer an endless array of problems. To put it simply, college curriculums aim to allow engineers to grow overtime with the expectation that all information will be tied together in the end and can be recalled and utilized in some fashion to answer the consumer's need. College is all building, and practicing, with due dates simulating a consumer's actual time of need for a product, and one's grade simulating how the consumer reacts to one's work. Also, studying is acquiring one's unique engineering toolbox while working is applying that toolbox to address a consumer's problem. However, what is physically done in school, one can expect it to be done in the industry as well.




<< < 1 2 3 4 > >>



© Copyright 2018 Jeremy Cruz