We Sell Bonds!
We Sell Bonds!
The quaint, brick-faced downtown office building was exactly the sort of place Alexis wanted her first real programming job to be. She took a moment to just soak in the big picture. The building’s façade oozed history, and culture. The busy downtown crowd flowed around her like a tranquil stream. And this was where she landed right out of college– if this interview went well.
Alexis went inside, got a really groovy start-up vibe from the place. The lobby slash waiting room slash employee lounge slash kitchen slash receptionist desk was jam packed full of boxes of paperwork waiting to be unpacked and filed (once a filing cabinet was bought). The walls, still the color of unpainted drywall, accented with spats of plaster and glue-tape. Everything was permeated with chaotic beginnings and untapped potential.
Her interviewer, Mr. Chen, the CEO of the company, lead her into the main conference room, which she suspected was the main conference room by virtue of being the only conference room. The faux-wood table, though moderately sized, still barely left room for herself and the five interviewers, crammed into a mish-mash of conference-room chairs, office chairs and one barstool. At least this room’s walls had seen a coat of paint– if only a single coat. Framed artwork sat on the ground, leaned up gently against the wall. She shared the artwork’s anticipation– waiting for the last coat of paint and touch-ups to dry, to hang proudly for all to see, fulfilling their destiny as the company grew and evolved around them.
"Thank you for coming in," said Mr. Chen as he sat at the head of the conference table.
"Thank you for having me," Alexis replied, sitting opposite him, flanked by the five other interviewers. She was glad she’d decided to play cautious and wear her formal ‘Interview Suit’. She fit right in with the suits and ties everyone else was wearing. "I really dig the office space. How long have you been here?"
"Five years," Mr. Chen answered.
Her contextual awareness barely had time to register the whiplash of unpainted walls and unhung pictures in a long occupied office– not that she had time to process that thought anyways.
"Let the interview begin now," Mr. Chen said abruptly. "Tell me your qualifications."
"I– uh, okay," Alexis sat up straight and opened her leather folder, "Does everyone have a copy of my resume? I printed extra in case– "
"We are a green company," Mr. Chen stated.
Alexis froze for a moment, her hand inches from the stack of resumes. She folded her hands over her own copy, smiled, and recovered. "Okay. My qualifications…" She filled them in on the usual details– college education, GPA, co-op jobs, known languages and frameworks, contributions to open source projects. It was as natural as any practice interview she’d ever had. Smile. Talk clearly. Make eye contact with each member of the interview team for an appropriate length of time before looking at the next person.
Though doing so made her acutely aware that she had no idea who the other people were. They’d never been introduced. They were just– there.
As soon as she’d finished her last qualification point, Mr. Chen spoke. "Are you familiar with the bonds market?"
She’d done some cursory Wikipedia research before her interview, but admitted, "An introductory familiarity."
"You are not expected to know it," Mr. Chen said, "The bond market is complicated. Very complicated. Even experienced brokers who know about futures contracts, forward contractions, options, swaps and warrants often have no idea how bonds work. But their customers still want to buy a bond. The brokers are our customers, and allowing them to buy bonds is the sole purpose of ‘We Sell Bonds!’."
Though Mr. Chen had a distinctly dry and matter-of-fact way of speaking, she could viscerally HEAR the exclamation point in the company’s name.
"Very interesting," Alexis said. Always be sure to compliment the interviewer at some point. "What sort of programming projects would I be working on?"
"The system is very complicated," Mr. Chen retorted. "Benny is our programmer."
One of the suited individuals to her left nodded, and she smiled back at him. At least now she knew one other person’s name.
"He will train you before you may modify the system. It is very important the system be working properly, and any development must be done carefully. At least six months of training. But the system gathers lots of data, from markets, and from our customers. That data must be imported into the system. That will be part of your duties."
Again, Alexis found herself sitting behind a default smile while her brain processed. The ad she’d answered had clearly been for a junior developer. It had asked for developer skills, listed must-know programming languages, and even been titled ‘Junior Developer’. Without breaking the smile, she asked, "What would you say the ratio of data handling to programming would be?"
"I would say close to one hundred percent."
Alexis’ heart sank, and she curled her toes to keep any physical sign of her disappointment showing. She mentally looked to her sliver-linings view. Sure, it was data entry– but she’d still be hands-on with a complicated financial system. She’d get training. Six months of training, which would be a breeze compared to full-time college. And if there really was that much data entry, then the job would be perfect for a fresh mind. There’d be TONS of room for introducing automation and efficiency. What more could a junior developer want?
"That sounds great," Alexis said, enthusiastic as ever.
"Good," Mr. Chen said. "The job starts on Monday."
Her whiplash systems had already long gone offline from overload. Was that a job offer?
"That– sounds great!" Alexis repeated.
"Good. Nadine will email your paperwork. Email it back promptly."
And now Alexis knew a second person’s name. "I look forward to meeting the whole company," she said aloud.
"You have," Mr. Chen replied, gesturing to the others at the table. "We will return to work now. Good day."
Alexis found herself back on the sidewalk outside the quaint brick-faced downtown office building, gainfully employed and not sure if she actually understood what the heck had just happened. But that was a problem for Monday.
Alexis arrived fifteen minutes early for her first day at the quaint brick-faced downtown office– no, make that HER quaint brick-faced downtown office.
Fourteen minutes later, Mr. Chen unlocked the front-door from the inside, and let her in.
"You’re early," he stated, locking the door behind her.
"The early bird gets the worm," she clichéd.
"You don’t need to be early if you are punctual. Follow."
Mr. Chen lead her through the lobby, and once again into the main boardroom. As before, five people sat around the conference table. Alexis figured there’d be formalities and paperwork to file before she got a desk. HER desk! The whole company (all six of them– though now it was seven) were here to greet her. And, for some reason, they’d brought their laptops.
"You will sit beside Benny," Mr. Chen said, taking his seat.
Next to Benny, there was an empty chair, and an unoccupied laptop. Alexis slunk around the other chairs, careful not to knock over the framed posters that were still propped against the wall, and sat beside the lead programmer.
"Morning meeting before getting down to work, huh?" she said, smiling at him.
Benny gave her a sideways glance. "We are working."
Alexis wasn’t sure what he meant– and then she noticed, for the first time, that everyone was heads down, looking at their screens, typing away. This wasn’t just a boardroom. This was her desk. This was everyone’s desk.
Over the morning, Benny gave her his split attention– interspersing his work with muttering instructions to her; how to log in, where the data files were, how to install Excel. He would only talk to her in-between steps of his task; never interrupting a step to give her attention. Sometimes she just sat there and watched him watch a progress bar. She gathered he was upgrading a server’s instance of SQL Server from version "way too old" to version "still way too old, but not as much".
After lunch (also eaten at the shared desk), Benny actually looked at her.
"Time for your first task," he said, giving her a sheet of paper. "We have a new financial institution buying bonds from us. They will use our Single SignOn Solution. You will need to create these accounts."
She took the sheet of paper, a simple printed table with first name, last name, company name, username and password.
Alexis was recently enough out of college that "Advanced Security Practices 401" was still fresh in her mind– and seeing a plaintext password made her bones nearly crawl out of her skin.
"I– um– are there supposed to be passwords here?"
Benny nodded. "Yes. To facilitate single sign-on, usernames and passwords in ‘We Sell Bonds!’ website must exactly match those used in the broker’s own system. Their company signs up for ‘We Sell Bonds!’, and they are provided with a website skinned to look like their own. The company’s employees are given a seamless experience. Most don’t even know they are on a different site."
Her skin gnawed on her bones to keep them in place. "But, if the passwords here are in plaintext, that is their real, actual password?"
Benny gave her the same nod. "They must be. Otherwise we could not log in to test their account."
That either made perfect sense, or had dumbfounded all the sense out of Alexis, so she just said "Ok." The rest of the day was spent creating accounts through an ASP interface, then logging into the site to test them.
When she arrived at the quaint brick-faced office building the next day, there was a large stack of papers at her spot at the communal desk. Benny said, "Mr. Chen was happy with your data entry yesterday."
Mr. Chen, who was seated at the head of the shared desk, didn’t look up from his laptop screen. "You are allowed to enter this data too."
"Thank you?" Alexis settled in, and got to work. For every record she entered, a different way of optimizing this system would flitter through her mind. A better entry form, maybe auto-focus the first field? How about an XML dump on a USB disk? Or a SOAP service that could interface directly with the database? There could be a whole validation layer to check the data and pre-emptively catch data errors.
Data errors like the one she was looking at right now. She waited patiently for Benny to complete whatever step of his task he was on, and showed him the offending records.
"I don’t see the problem," Benny said, shortly.
"John Smith and Jon Smith both have the same username, jsmith" she said, not sure how to make it more clear.
"Yes, they do," Benny confirmed.
"They can’t both have the same username."
"They can!" Mr. Chen’s sudden interjection startled her– though she wasn’t sure if it was because of the sharpness of his tone, or because she hadn’t actually heard him speak for a day and a half. "Do you not see that they have different passwords?"
"Uh," Alexis checked, "They do. But the username is still the same."
There was no response. Mr. Chen was already looking back at his screen. Benny was looking at her expectantly.
"So users are differentiated by their– password?" she said, trying to grasp what the implications of that would be. "What if someone changes their password to be– "
"Users don’t change passwords," Benny replied. "That would break single sign-on. If a user changes their password in their home system, their company will submit a change request to us to modify the password on ‘We Sell Bonds!’."
Alexis blinked– this time certain that this made no sense, and she was actually dumbfounded. But Benny must have taken her silence as ‘question answered’, and immediately started his next task. It made no sense, but she was still a junior developer, fresh out of school; full of ideas but short on experience. Maybe– yeah, maybe there was a reason to do it this one. One that made sense once she learned to stop thinking so academically. That must be it.
She dutifully entered two records for jsmith and kept working on the pile.
Friday. The end of her first real work week. Such a long, long week of data entry, interspersed by being allowed to witness a small piece of the system as Benny worked on his upgrades. At least she knew now which version of SQL Server was in use; and that Benny avoided the braces-verses-no-braces argument by just using vbscript which was "pure and brace-free"; and that stored procedures were allowed because raw SQL was too advanced to trust to human hands.
Alexis stood in front of the quaint brick-faced office building. It was familiar enough now, after even just a week, that she could see the discoloured mortar, and cracked bricks near the foundation, and the smatterings of dirt and debris that came with being on a busy downtown street.
She went into the office, and sat down at the desk. Another stack of papers for her to enter, just like the day before, just like every day this week. Though something was different. In the middle of the table, there was a box of donuts from the local bakery.
"Well, that’s nice," she said as she sat down. "Happy Friday?"
Everyone looked up at her at the same time.
"No," Mr. Chen stated, "Friday is not a celebration; please do not detract from Benny’s success."
She felt like she wanted to apologize, but she didn’t know why. "What’s the occasion, Benny?"
"He has completed the upgrade of the database. We celebrate his success."
That seemed reasonable enough. Mr. Chen opened the box. There was an assortment of donuts. Seven donuts. Exactly seven donuts. Not a dozen. Not half a dozen. Seven. Who buys seven donuts?
Mr. Chen selected one, and then the box was passed around. Alexis didn’t know much about her coworkers (a fact that, upon thinking about it, was not normal)– but she did know enough about their positions to recognize the box being passed around in order of seniority. She took the last one, a plain cake donut.
"Well," she said, making a silver lining out of a plain donut, "Congratulations, Benny. Cheers to you."
"Thank you," he said, "I was finally able to successfully update the server for the first time last night."
"Nice. When do we roll it out to the live website?"
Benny looked at her a blankly. "The website is live."
"Yeah, I know," Alexis said, swallowing the last bit of donut. It landed hard on the weird feeling she had in her stomach. "But, y’know– you upgraded whatever environment you were experimenting on, right? So now that that’s done, are you, like– going to upgrade the live, production server over the weekend or something– like, off hours?"
"I have upgraded the live, production server. That is our server. That is where we do all the work."
Alexis became acutely aware that the weird feeling in her stomach was a perfectly normal and natural reaction to thinking about doing work directly on a live, production server that served hundreds of customers handling millions of dollars.
Mr. Chen finished his donut and said, "Benny is a proper, careful worker. There is no need to waste resources on many environments when one can just do the job correctly in the first place. Again, good work, Benny, and now the day begins."
Everyone turned to their laptops, and so did Alexis, reflectively. She started in on the first stack of papers to enter into the database– the live, production database she was interfacing directly with– when she heard a sound she’d never heard before.
A phone rang.
The man beside Mr. Chen– Trevor, she thought his name was, stood up and excused himself to the lobby to answer the phone. He returned after a few moments, and put a piece of paper on top of her pile.
"That request should be queued at the bottom of her pile," Mr. Chen said as soon as Trevor’s hand was off the paper.
"I believe this may be a case of priority," Trevor replied. He had a nice voice. Why hadn’t she heard her co-worker’s voice after a week of working here? "A user cannot log in."
She glanced down at the paper. There was a username and password jotted down. When she looked back up at Mr. Chen, he waved her to proceed. Alexis pulled up "We Sell Bonds!" home page, and tried to log in as "a.sanders"
The logged-in page popped up. "Huh, seems to be working now."
"No," Trevor said, "You should be logged in as Andrew Sanders from Initech Bonds and Holdings, not Andrew Sanders from Fiduciary Interests."
"But I am logged in as a.sanders from Initiech, see?" she brought up the account details to show Trevor.
"No, I tried it myself. I will show you." Trevor took her laptop, repeated the login steps. "There."
"Huh." Alexis stared at the account information for Andrew Sanders from Fiduciary Interests. "Maybe one of us is typing in the wrong password?"
Alexis tried again, and Trevor tried– and this time got the results reversed. They tried a new browser session, and both got Initech. Then try tried different browsers and Trevor got Initech twice in a row. They copy and pasted usernames and passwords to and from Notepad. No matter what they tried, they couldn’t consistently reproduce which Andrew Sanders they got.
As Alexis tried over and over to come up with something or anything to explain it, Benny was frantically running through code, adding Response.Write("<!– some debugging message –>") anywhere he could think might help.
By this point the whole company was watching them. While that shouldn’t be noteworthy since the entire company was in the same room, being paid attention to by this particular group of coworkers was extremely noticeable.
And of all the looks that fell on her, the most disconcerting was Mr. Chen’s gaze.
"Determine the cause of this disruption to our website," he said flatly.
"I don’t get it," Alexis said, "This doesn’t make any sense. We should be able to determine what’s causing this bug, but– um– hang on."
Determine– the word tugged at her, begging to be noticed. Or begging her to notice something. Something she’d seen on Benny’s screen. A SQL query. It reminded her of a term from one of her Database Management exams. Deterministic. Yes, of course!
"Benny, go back to that query you had on screen!" she exclaimed! "Yes, that one!"
As she pointed at Benny’s screen, Mr. Chen was already on his feet, heading over. A perfect chance for her to finally prove her worth as a developer.
"That query, right there, for getting the user record. It’s using a view and– may I?" she took over Benny’s laptop, focused on the SQL Management Studio, but excitedly talking aloud as she went.
"Programmability… views… VIEW_ALL_USERS… aha! Check it out."
SELECT TOP 100 PERCENT * FROM TABLE_USERS ORDER BY UserCreatedDate
"Which," she clicked back to the query, "Is used here…"
SELECT * FROM TABLE_USERS WHERE username=@Username and password=@Password
"… and we only use the first record we return, but I’ve read about this! Okay, like, the select without an ORDER BY returns in random order– no no no, NON-DETERMINISTIC order, basically however the optimizer felt like returning them, based on which ones returned faster, or what it had for breakfast that day, but totally non-deterministic. No "ORDER BY" means no order. Or at least it is supposed to, but, like, SQL Server 2000 had this bug in the optimizer, which became this epic ‘undocumented feature’. When you did TOP 100 PERCENT along with an ORDER BY in a view, the optimizer just bugged the fudge out and did the sorting wrong, but did the sorting wrong in a deterministic way. In effect, it would obey the ORDER BY inside the view, but only by accident. But, like I said, that was a bug in SQL Server 2000, and Benny, WE JUST UPGRADED TO SQL SERVER 2005!"
She held her hands out, the solution at last. Mr. Chen was standing right there. Okay, perfect– because what had Logical Thinking and Troubleshooting 302 taught her? Don’t just identify a PROBLEM, also present a SOLUTION!
"Okay, look– I bet if I query for users with this username and this password– " she typed the query in frantically– "see, right there, that’s Andrew Sanders from Initech AND Andrew Sanders from Fiduciary Interests. They both have the same username and password, so they’re both returned. I bet no one ever noticed before. That other guy has no activity on his account. So all we really have to do is put the same ORDER BY into the query itself– and– click click, copy paste– there! Log in and– there’s Mr. Initech. Log out, log in, log out, log in– I could do this all day and we’ll get the same results. Tah-dah!"
She sat back in her chair, grinning at her captive audience. But they weren’t grinning back. Instead they were averting their gaze. Everyone– except for Mr. Chen. There was no doubt he was staring right at her. Glaring.
"Undo that immediately," he said, in an extremely calm voice that did not match his reddening face.
"I, uh– okay?" she reached for the keyboard.
"BENNY!" Mr. Chen rebuked, "Benny, you undo those changes."
Benny snatched the laptop away, and with a barrage of CTRL-Z wiped away her change.
"But– that fixes the bug– "
"No," Mr. Chen stated, "The CORRECT fix is to delete the second record, and inform Fiduciary Interest that their Andrew Sanders may not have access to this system until he changes his password to something unique. Then there is no code change needed."
"But but– " Alexis stumbled, "It’s a documented Microsoft bug, and if– "
"The code of ‘We Sell Bonds!’ is properly and carefully written. We do not change it to conform to someone else’s mistakes. This complex code change you unilaterally impose is unknown, untested, unreliable and utterly unacceptable. You would determine the course of a financial business based on an outrageous outside case?"
"But, it’s happening and causing a problem now and– "
Benny pointed at his screen, where he’d entered a query with a GROUP BY and HAVING. "Only eight usernames are duplicated like that."
"Vanishingly small," Mr. Chen said, "Benny, print out those users, and then delete them. Nadine, contact those companies and inform them those users will not have access to the website until their information is corrected. With that solved, we can all resume work."
Everyone at the company returned to their tasks. Alexis stared at her screen for a moment, at the ASP management screen that waited for her data to be entered. It didn’t implement any change. It didn’t introduce any progress. It was just an ASP form for data entry. And that was her job.
She entered her data.
At lunch, when everyone in the company got up to take their break, Mr. Chen motioned for her to sit back down. After the rest of the company filed out, he spoke.
"Alexis, although your ability to interface with the system is adequate, I am afraid your inability to focus on your task is not. I require a worker who is careful and proper, and you are not. Thank you for your time. You will be paid for the remainder of the day, but may go home now. I will see you out."
Alexis erred on the better side of valor, and did not shout in his face that he can’t fire her, because she was quitting.
Mr. Chen ushered her out the front door, and locked it behind her.
Alexis stood on the busy sidewalk, the lunchtime crowd pushing and shoving their way past her. She looked back on the quaint, brick-faced office building. On the surface, it had been exactly what she’d wanted from her first programming job. She only got one "first" job, and it had ended up being– that.
She wallowed for a moment, and then pulled herself back together. No. Data entry did not a programming job make. Her real first programming job was still ahead of her, somewhere. And next time, when she thought she’d found it, she would first look– properly and carefully– past the quaint surface to what lay beneath.