Flippant Remarks about “What Your Culture Really Says”

I’ve been reading the work of @shanley—work like “What’s Wrong With @antirez’s Post on Sexism in IT”—and I can immediately tell that I don’t need to be writing carefully around her thinking. I sense an authenticity in her strength of character—whether the character is one designed for writing publically or actually hers in “real” life.

I wrote in “Why I failed to talk to Carl Franklin about “Race” in the IT (Information Technology) World…” that the prejudice against women in the IT workplace is almost identical to that of the racist aesthetic used to poison “minorities.” In “What Your Culture Really Says,” @shanley makes my point without really trying:

What your culture might actually be saying is… We have implemented a loosely coordinated social policy to ensure homogeneity in our workforce. We are able to reject qualified, diverse candidates on the grounds that they “aren’t a culture fit” while not having to examine what that means – and it might mean that we’re all white, mostly male, mostly college-educated, mostly young/unmarried, mostly binge drinkers, mostly from a similar work background. We tend to hire within our employees’ friend and social groups.

I am embarrassed for the self-described Black women and men of tech that I’ve encountered digitally over the years because I know that too many of these folks would not only fail to write like this in public—even under an assumed name like “The Corporate Negro”—but off the record they would fail to write or speak like this in relative privacy. How do I know that @shanley is not Black? Surprise me. I dare you.

Anyway, I’m pretty sure that @shanley is not Black.

What’s deeper here is that I am almost certain that @shanley and I would agree that most IT “cultures” are Lord-of-the-Flies boy’s clubs (you can even have a “diverse” boy’s club but everyone speaks with the same Valley-Girl, posh American, Metro-sexual accent, wearing that same Star Trek uniform with a goatee) and we would also agree that there is nothing “evil” about these clubs—until they start telling lies to themselves and others that they represent a “universal” view. They should be honest and self-realized about their cave-man frat-boy, ethnic, provincial shit. Who am I to say this? These are the words coming from a physics student out of UCSB. I’ve worked in astrophysics labs and some of the first personal computer labs for institutional education in the country. I’ve worked in multi-billion-dollar finance, pharmaceutical and entertainment companies. I’m not talking out of ignorance. I don’t have an Al-Sharpton perm cascading split ends over my eyes, giving me an over-simplified black-plastic view of the world.

I know that I am dealing with a bunch of assholes (regardless of color-of-skin) when it becomes clear to me that the bunch has no accurate, well-researched idea of how they are perceived by outsiders. When a group can respectfully and almost-joyfully imagine why people would not want to be in their group then that group has something actually going on in the realm of reality-touching… The key is that imaginative respect. In the world of IT we often prioritize artificial intelligence over organic intellection. When I strongly suspect that my “team leader” used to openly call his mother a “bitch”—to her face—then I know it’s only a matter of time before I’m no longer a “cultural fit” for the “universal” business team of hurray-for-everything…

Related Links

Why I failed to talk to Carl Franklin about “Race” in the IT (Information Technology) World…

First of all it was not Carl Franklin’s fault. In fact, it was Carl that brought up the topic—“something we should get into”—during the pre-show warm-up for .NET Rocks! #416, recorded in 2009. Second of all, the fact that it has taken me three years to respond to this issue is an indicator of not how little talking about “race” means to me but how many obstacles have been holding me back from addressing this issue properly.

Hanselminutes on 9 - ASP.NET 4 and David Fowler on LinqExtender

In fact, for those who are left alive who claim to know me well—my negligence to bring up the “race issue” in detail on a popular show like .NET Rocks! would be considered yet another “contradiction” about my supposed personality. You mean to tell me Bryan did not pull the “race card” on a talk show that gets over 20 million downloads a month? What’s wrong with Bryan? Is he scared to lose his job or something? How can he look down on Microsoft and Telerik employees—and their golden muzzles when clearly he is muzzling himself with some nasty twine he found in a back alley—right?

The short response to all of these “questions” is that Carl wanted to bring up the topic. Once we got talking it was clear that I was not going to find the opportunity to get into the topic—and it would be too much of a risk to suddenly question me about it “for no reason”—surely more than one listener would accuse Carl of going way, waaay off topic.

In 2009, I was still struggling with XSLT and XML—two very, very unpopular technologies in the Microsoft world. I remember talking about the importance of the obscure System.Data.Common namespace in the .NET Framework—which is now applied in the famous Entity Framework. My struggles show up in my voice. I have a speech impediment—very similar to the one the awesome David Fowler of Microsoft has. But unlike David Fowler, I do not have Damian Edwards to stand in for me when things get a little tight and I begin to stutter.

—And for those of you who are “clever” you may now assume that I am talking about “race”… (as a reminder, I put words like “race” in quotes because this is current vernacular of the time—not my time…)

In the-history-according-to-me, David Fowler is the first Microsoft personality that is a day-to-day, social-networking power player being continually recognized for his excellence by self-described “white” people (—this is quite different from simply having one’s existence recognized, by the way). Now for the complexity: Dare Obasanjo is a Microsoft employee—what about him? There are hundreds of thousands of corporate colored folk like Dare Obasanjo—but the following is not flattery: Dare is too “high up” (or “long gone”) to be as accessible as David Fowler. I consider Dare Obasanjo to be senior—he was there before Twitter. He was there, like me, when blogging first came out—he has developed patterns and practices that do not include the activities that a young cat like David Fowler does every day. It follows that:

One of the reasons why you see so few qualified African-descended people in the usual nerd social circles is that they have no time for it. They have been so successful their lifestyle shows no need for it.

Let’s take an extreme case. Think about the Indian-descended Om Malik in the nerd circles of Leo Laporte. Om showed up on Leo’s shows a few times and then started sending his employees to appear on Leo’s shows. So what we have is a tech elite that seriously have no time to be playing around with all due respect. (What of course is subtly racist is to be angry with Om—or to accuse Om of being “arrogant” for not having time for Leo—but Leo strikes me as not being that type of guy…)

But this observation should beg the question, “Where is African-descended ‘middle-class’ of tech in this brave-new Twitter world?” I’ve got four names: David Fowler (and he’s getting richer every day so his time is running out), Tiffany B. Brown, Denise Jacobs and the super-fine network-administration geek, Adria Richards. Yes, I’m sure there’s more but few (including the people aforementioned) would want to be in my little list.

When I’ve walked into a “blacks of tech” meeting here in Southern California over the years, I have rarely run across a straight-up, hard-core software developer with strong African features. Too many (for my taste) are managers or “entrepreneurs.” It’s like being a musician with a love for the music continually trying to socialize with (and being disrespected by) predators of the music—exploiters of the music—dudes who don’t give a f’ about the music—dudes pretending to know how to play but you never see them get down.

The first hard-core software developer I ever met was a super-fine, super-model-looking database programmer from Sierra Leone. I was so excited to talk to her about tech and she was so not interested in talking about her “day job” (granted: this was before the Internet as we knew it and we were at a 20-something house party). The second hard-core software developer I met was another super-fine sister, Kathy Lott. She hired me for a while to run a program she called “Kids 2000”—using computers to teach literacy to children. The third hard-core software developer I met at a “Blacks in tech” meeting was an older brother that did work for the government. His grasp over the concepts of computer science were sage like—he was a Thelonious-Monk character, kept in the shadows like a freak while the other mediocre manager-types dominated the show.

So the previous paragraph sounds like my talk about “race” and IT has nothing to do self-described “white” folks being total assholes. No. Not so… But my point would be that I have less control over self-described “white” folks being assholes. I still assume that I have more control (and resources better spent) when talking about the deep, deep flaws in the so-called Black “community” that fails to serve/revere/encourage/respect women and men with a technical background. However, I am not going to talk about these deep, deep flaws in forum like .NET Rocks.

Now I’m going to throw out a few flippant remarks within this context constructed by me:

  • Many of the issues facing women in tech are identical to those faced by people of color in tech—especially African-descended peoples. So any new-media show about women in tech is (for me) a show about African-descended peoples in tech. …And many of these shows suck.
  • The research skills that I used to study Black History are the same skills I use to study technology. And these are quite effective. So my habit of quoting sources and providing references comes from an “unexpected place.” Thank you Dr. Gerald Horne!
  • The challenges that I face in the corporate-American IT world are largely amplifications of the same problems everyone of any skin color might have in the workplace. Think about an agile convert trying to survive in a waterfall world.
  • What is rarely explored in the context of “race” talk is something we took for granted at the beginning of our Black education: that the world as it exists today is based on foundations that are fundamentally incorrect—and this why many actual “Blacks in tech” embrace new technologies faster than their “mainstream” counterparts because we are always looking for better technical tools in this wickedly wack bullshit called “the developed world.” You think the relationship between Stevie Wonder and Ray Kurzweil was a freak accident?
  • My relationship with the concept of “correctness” is independent of any contemporary organization in the existence of my awareness. These ancient connotations—timeless connotations (after the first three minutes of the universe)—with “correctness” should be a well-known “ethnic trait” among us African descended people. It is my relationship with the sacredness of “correctness” that is the root of any conflict I may have had—and, sadly, will have—with self-described “normal” people.

I’ve heard Carl Franklin on a few rare occasions on .NET Rocks assert with a hint of irritation that he understands what is being said to him. The person talking at him is usually an asshole-like guy laying down some condescending, sophomoric “intellectual framework”—and Carl will interrupt this guy with the words, “I understand!” The world of Information Technology is full of these condescending, sophomoric characters—many of these minions are middle managers. You notice how “race” has nothing to do with this asshole situation? “Race” merely amplifies this situation. What racism does is help me find these assholes (and often unemployment) faster.

There is no need to slay the wicked.

Just leave them to themselves.

And they will perish…

Related Links

My Three WCF Paths to Silverlight Data Access

Flippantly, here they are:

  • One: Silverlight-enabled WCF Service (backing View Model collections with ObservableCollection<T> by default)
  • Two: WCF Data Service (OData, backing View Model collections with DataServiceCollection<T>)
  • Three: Domain Service Class (RIA Services, backing View Model collections with LoadOperation<T>)

ServiceReferences.ClientConfig Is Useless in a XAP That Is Loaded by Another XAP.

My Songhay.Silverlight.ApplicationLoader compiles into an 8KB XAP file and is designed to load a bigger XAP file—which in turn uses MEF to load even bigger XAP files. One of these MEF-composed XAP files may contain a Service Reference, which, by default, generates ServiceReferences.ClientConfig. This file is designed to be used by the initial XAP declared in the HTML markup used to call Silverlight. My initial XAP is only 8KB and has no room for one or more Service Reference entries.

My way around this issue is to replicate the ServiceReferences.ClientConfig declarations imperatively. I have written an extension method to System.Windows.Application that accomplishes this:

public static BasicHttpBinaryBinding GetServiceClientBinding(this Application app)
{
    var mode = app.Host.Source.Scheme.Equals("https",
        StringComparison.InvariantCultureIgnoreCase) ?
        BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None;
    var binding = new BasicHttpBinaryBinding(mode);
    binding.MaxReceivedMessageSize = int.MaxValue;
    binding.MaxBufferSize = int.MaxValue;
    return binding;
}

For more details, see “Silverlight ServiceReferences.ClientConfig Alternatives” by Manish Dalal. Notice the my extension method returns a binary HTTP binding—Silverlight requires this more payload-efficient binding, which is the chief characteristic of a Silverlight-enabled WCF service.

IEditableObject Moves CRUD Eventing into the View Model

Controls like the DataForm use IEditableObject by convention, defining three methods BeginEdit, CancelEdit and EndEdit. The “begin” method is an opportunity to cache the instance implementing IEditableObject such that the “cancel” method can be used to restore data from this cache. The “end” method passes the instance implementing IEditableObject to the data layer.

Based on my current level of experience with this IEditableObject pattern, I am recklessly confident that my “end” method will not need to distinguish between Insert and Update. This suggests that I am rather foolish and/or I am setting a default value for the primary key associated with my instance implementing IEditableObject—like this:

[Display(Name = "Primary Key", Order = 0)]
[Key, Editable(false)]
public int? PrimaryKey
{
    get { return this.GetPrimaryKey(ref this._key); }
    set
    {
        this._key = value;
        base.RaisePropertyChanged("PrimaryKey");
    }
}

My private method GetPrimaryKey() passes the key field by reference and should be able to derive a valid key for the real-world underlying database. In fact, it can actually perform an Insert operation and have an “empty” record persisted before the user begins an edit session. This technique strongly suggests that the “cancel” method in the IEditableObject contract needs a cleanup procedure to ensure that the underlying database is not littered with “empty” records. I may need to study how more experienced developers address these issues.

What I do notice is that there appears to be no way to use IEditableObject with Delete operations. I assume that one would have to fall back on control eventing to handle any ceremony around deletes. The DataForm, for example, has a DeletingItem event, described by Tim Heuer in “Silverlight DataForm and confirming deleting an item.” Another DataForm event to consider is the EditEnded event, covered by Dino Esposito in “The DataForm Control in Silverlight 3—Revisited.”

My Scroll-into-View Strategy for the DataGrid

As of this writing this is my scroll-into-view strategy for the DataGrid:

this.DataGridOne.SelectionChanged += (s, args) =>
{
    if(this.DataGridOne.SelectedIndex == this._previousSelectedIndex) return;
    this._previousSelectedIndex = this.DataGridOne.SelectedIndex;
    this.DataGridOne.ScrollIntoView(this.DataGridOne.SelectedItem,
        this.DataGridOne.Columns[0]);
};

This approach requires declaring an x:Name on the DataGrid.

PagedCollectionView Swallows Collections Whole!

As of this writing, I know of only ways to implement the classic Master-Detail relationship between, say, the DataGrid and DataForm: with a PagedCollectionView and with the simpler CollectionViewSource. Both of these types implement ICollectionView (for details, see the 2008 article “ICollectionView explained”).

Because the PagedCollectionView supports client-side paging (and the DataPager), I prefer the CollectionViewSource (however, when server-side paging is in effect the CollectionViewSource might be useful when a more lightweight design is required). With the PagedCollectionView, the initial problem for me was getting synchronization to work between the Master control and the Detail control—the ObservableCollection<T> was not working out of the box. However, passing an instance of ObservableCollection<T> into the constructor of PagedCollectionView did the trick!

DataServiceCollection<T> is not “Blendable”

Because DataServiceCollection<T> has a dependency on some data-service “context,” DataServiceCollection<T> is not “Blendable” because mocking up design-time data is non-trivial (it may require a live, local OData service always running). However, because DataServiceCollection<T> is a subclass of ObservableCollection<T>, the recommendation here is to use ObservableCollection<T> in View Models.

Flippant Remarks about Job Interview Questions

In my ever-changing world, there interview questions that are well placed and worth my time and then there are ‘trick’ questions that are (to me) more of a personality test than a technical test (based on the technology actually used in the workplace). It is better to ask about personality directly in an interview rather than indirectly inquiring (either deliberately or out of ignorance).

Adam is a Hash Table

These are the questions I’ve encountered (that I could not answer) over the last few weeks that are worth my time:

  • What is the difference between the Logical Tree and the Visual Tree? This question can be considered a fundamental WPF question—but it is the kind of question that only comes from experience with advanced scenarios—or by reading some extensive prose meditating on how WPF works. In 2007, Josh Smith does exactly that in “Understanding the Visual Tree and Logical Tree in WPF.” As Jason Dolinger of lab49 suggests in “Exploring the WPF Logical and Visual Trees,” the logical tree closely represents programmers intent (what is declared by the programmer in XAML) while the Visual Tree represents what WPF or Silverlight is doing under the hood to actually render what is intended.
  • What is _ViewStart.cshtml? I actually was very warm on this one. This is a great question to test for MVC3-level intimacy. I have not been working with MVC on a daily basis over the last three months so I’m not too upset for not getting this one.
  • What is the purpose of the yield keyword? This question opens a whole new subject of computer science under the heading “state machine”—according to stackoverflow.com: “Yield is implemented by the compiler as a custom class that implements a state machine.” Erik Forbes: “Yield is used to create implementations of the Enumerable pattern—a software pattern that allows you to treat a collection of things as an enumeration, over which you can perform some process.” MSDN: “The yield statement can only appear inside an iterator block, which can be implemented as the body of a method, operator, or accessor.” I really should know about this topic. No “excuses” here.
  • What is the difference between ref and out parameter modifiers? “…semantically, ref provides both ‘in’ and ‘out’ functionality, whereas out only provides ‘out’ functionality.” Where in refers to initializing the variable/parameter (with the expectation that it will be read inside the method accepting the parameter). This implies that out suggests that the parameter is write-only. I cannot think of a situation (outside of Interop and TryParse patterns) where using ref or out parameters are required. I prefer to use a struct or a class (stacking complexity vertically) over using multiple parameters (stacking complexity horizontally).
  • How can custom validation be centralized/reused by several view models? The CustomValidationAttribute accepts a Type and a method-name string where the Type points to a central validation class. I have actually written code using this kind of centralized custom validation—but clearly not enough to memorize this level of detail during a job interview.
  • What is the volatile keyword? “The volatile modifier is usually used for a field that is accessed by multiple threads without using the lock statement to serialize access. Using the volatile modifier ensures that one thread retrieves the most up-to-date value written by another thread.” My limited understanding of threading is a known issue—I was actually relieved to find out that this question was related to threading.

Here are some parlor-trick questions that are not really worth my time (but they are apparently worth serious money):

  • How would you swap the contents of two variables? I am unable to think of any real-world situation where I would need to do this. I actually got angry when I was asked this question—which prevented me from answering the question properly.
  • Given a LinkedList, with a head and a tail, how would you make the head a tail and the tail a head? I assume that the short answer here is to use the Reverse() method (see MSDN). When you can’t use Reverse(), then you can (ha, ha) swap the contents of the Next and Previous properties of LinkedListNode<T> in a state machine with null checks—null implying a head/tail. When this question was presented to me, I assumed that the head was at the top of a hierarchy (like a parent node) and the tail was the last child in this hierarchy—this caused me to shut down and short circuit at the whiteboard in more inappropriate fits of anger. (This question, by the way, was not asked of me within the last few weeks but about four months ago—before I took my last job.)
  • What is the difference between a Dictionary and a HashTable? As far as I’m concerned, a Dictionary supports generics and HashTable does not (it boxes values in object)—that’s the difference. The lack of generics support implies that HashTable is irrelevant to me for most of my work (but this may imply that I’m ignorant of the use of HashTable in distributed cache systems—used in the real world of high-traffic Web sites).

So the personality test that I’m failing is that I get angry when people f around with me—such that my anger prevents me from protecting myself. My anger causes me to go into a form a paralysis that renders me useless. When sadists sense this, they attempt to press my buttons with abandon.

Beyond the anger, some of these parlor trick questions are really tests that look for computer science training over, say, physics training. So here are some ‘pure’ computer science subjects I’m sensing out there:

  • The technical history of collections. (Who invented the LinkedList and why?)
  • Memorializing sort algorithms. (What is a bubble sort?)
  • Bitwise operations. (What is the [Flags] attribute used for?)

I do admit that these subjects are of little interest to me and I maintain that it is unfair to refuse to hire a person based almost entirely on whether they are knowledgeable in these areas. To me, you don’t hire a person that is not aware of, say, how MVC3 works intimately (which I have been guilty of). I am also guilty of being afraid of confrontation in these interviews (turning my anger against me)—what I should do is ask this question:

I do not understand this question, is there another one?

In the real world there should always be another question. The real world always operates in holistic diversity. There is no perfect, one way in real life. When my tester says no, there are no other questions, I should have the courage to politely conclude the interview, stand up and leave the building.

Related Resources

@elijahmanor, @jongalloway and others…

@elijahmanor Elijah Manor

“Modernizr.js : Feature Detection” by @OdeToCode #webdev z-t.go.ly

@elijahmanor Elijah Manor

“KnockoutJS Custom Binding for Invoking an Action with Enter Key” by @smichelotti #javascript sd3.go.ly

@jongalloway Jon Galloway

JSON Formatter & Validator—can take a URL and return validated / formatted JSON – jsonformatter.curiousconcept.com

@elijahmanor Elijah Manor

“Setting up ASP.NET MVC 3 to work with jQuery UI 1.9” #jquery http://v8h.go.ly

@elijahmanor Elijah Manor

“Replacing Text Nodes With jQuery” by @bennadel #jquery http://t5v.go.ly

@mtaulty Mike Taulty

I missed this “Was .NET all a mistake” bit.ly/peV466—the background is well written and it’s a good (provocative) discussion

@elijahmanor Elijah Manor

“SassAndCoffee 1.1 Released for ASP.NET (MVC & WebForms)” by @xpaulbettsx #aspnetmvc http://j.mp/owcJ6A

@pluralsight Pluralsight

Free Webcast—Improving Web Performance with Robert Boedigheimer—starts in 30 minutes! http://ow.ly/66uND RT

@codinghorror Jeff Atwood

“HTML5 standardizes every terrible practice inflicted on us by browser authors, making them part of the web forever.” stackoverflow.com/questions/3434…

@pluralsight Pluralsight

Steve Michelotti @smichelotti has just published a new course: ASP.NET MVC Scaffolding bit.ly/qQf8zy

@kazuhito Kazuhito Kidachi

Don’t use IDs in CSS selectors? ❧ Oli.jp (@boblet) – http://icio.us/kLHLoH

@jongalloway Jon Galloway

Strange to see IE Conditional Comments go http://bit.ly/qka6HV—handy for IE6 specific stylesheets, hopefully no longer as necessary.

@LeaVerou Lea Verou

Microsoft removes conditional comments, behaviors and XML Data Islands from IE10, due to incompatibilities with HTML5 blogs.msdn.com/b/ie/archive/2…

@JohnBristowe John Bristowe

Awesome scrolling experience is awesome: http://www.newzealand.com/

@KyleMcClellan Kyle McClellan

Survey: Tell me what you think of the RIA DomainService Wizard http://bit.ly/ljXCEq #RIAServices

@martinfowler Martin Fowler

I’ve published an article on eradicating non-determinism in tests: http://martinfowler.com/articles/nonDeterminism.html

@mattpodwysocki Matthew Podwysocki

Erik Meijer’s CoSQL paper on the duality of SQL and NoSQL got Slashdotted: http://bit.ly/feNxRE #cosql

@maryjofoley Mary Jo Foley

Microsoft readies three new Office service packs: http://zd.net/eW2kPK

@JesseLiberty Jesse Liberty

Posted: Linq: SelectMany http://ow.ly/1bT14x

@mtaulty Mike Taulty

Building with WCF RIA Services? http://goo.gl/fb/B3ysB

@davewiner Dave Winer ☮

I’ve never understood what the browsers guys do with RSS. http://r2.ly/6zem

@amyhoy Amy Hoy

i hate watching smart, capable people defend crap—or refuse to express strong opinions—in the name of “professionalism”