My Secret Life as a Spaghetti Coder
home | about | contact | privacy statement
This is the third in a series of answers to 100 Interview Questions for Software Developers.

The list is not intended to be a "one-size-fits-all" list. Instead, "the key is to ask challenging questions that enable you to distinguish the smart software developers from the moronic mandrills." Even still, "for most of the questions in this list there are no right and wrong answers!"

Keeping that in mind, I thought it would be fun for me to provide my off-the-top-of-my-head answers, as if I had not prepared for the interview at all. Here's that attempt.

Though I hope otherwise, I may fall flat on my face. Be nice, and enjoy (and help out where you can!).

Last week's answers on Functional Design had me feeling that way. Luckily, this week we come to technical design - a topic I feel quite a bit stronger on.

  1. What do low coupling and high cohesion mean? What does the principle of encapsulation mean?
    Coupling refers to how strongly or loosely components in a system are tied together. You want that to be low. Cohesion refers to how well the individual parts of a unit of code fit together for a single purpose. Encapsulation is about containing implementation of code so that outsiders don't need to know how it's works on the inside. By doing so you can reduce negative effects of coupling.

    Reading: Robert C. Martin's SOLID principles of OOD, which have been linked on this blog since day 1. His book, Agile Software Development: Principles, Patterns, and Practices is another great resource for this topic. It's short and to the point, and comes highly recommended from myself.



  2. How do you manage conflicts in a web application when different people are editing the same data?
    Set a flag when someone starts editing data unit A. If someone else loads it, let them know it's being edited and that it's currently in read only mode. If the race was too fast, you can also have a check on the commit side to let them know their changes conflict with another user, present them the data, and then let them figure out how to merge the changes. This has rarely been a problem in my experience, but it could be, and that's how I'd deal with it if the requirement came up. (If the changes don't conflict, you could simply keep the user unaware as well.)

    My answer comes from the things you see in normal usage of shared files or just about any shared resource, for that matter. Originally, it comes down to race conditions, so you might be able to extrapolate some useful information from that low-level explanation.

  3. Do you know about design patterns? Which design patterns have you used, and in what situations?
    I know about design patterns. Most of the ones I'm familiar with, at least in the canonical book, aren't of much daily use to me, as I tend to work in dynamic languages, where the sorts of flaws that precipitate the patterns (as implemented in the book) just aren't factors as often as in other languages. (Yes, some of the book is implemented in Smalltalk. I can implement them with as much superfluous junk as you desire in any language - that doesn't make it a necessity.)

    I suppose most frequently I've used the Strategy pattern. (Perhaps the fact that I've focused so much on one in particular is a weakness in my coding style?) The situations are when an interface should remain the same while the implementation should differ somewhat. I don't have a concrete example on the top of my head.

    If I were to start working in Java again, or building larger applications in .NET (I currently build very small apps in that space as part of my job), I'd re-read the book. I might even scan the inner cover daily just as a refresher.

    I wouldn't say I'm strong on design patterns, but I've got reference information and know where to look should I need to, along with the facilities to become strong should my situation call for it.

    Reading: The aforementioned book, Design Patterns: Elements of Reusable Object-Oriented Software. I hear good things about the better-selling Head First Design Patterns, but I've not read it myself, so I can't speak to its efficacy.

  4. Do you know what a stateless business layer is? Where do long-running transactions fit into that picture?
    I hadn't heard it as a single term until now, but knowing the individual terms lets me say that objects in the business layer (or domain model) are transient - or that their state is not preserved in memory between subsequent requests for the same object.

    This may note bode well for long running transactions, as state presumably must be set up each time an object is loaded, along with any process that might be required for tear-down.

    For reading, this is just information as I've come across it throughout my various readings, so I don't know what to recommend.

  5. What kinds of diagrams have you used in designing parts of an architecture, or a technical design?
    UML, or some bastardization of it has always been enough. Most likely the bastardized part where we just do a little design on paper or a whiteboard to gain a better understanding of the intended design through some sketch-work.

    I've never been a part of a team that practices BDUF, nor have I felt the need for it in any personal projects, so I'm light on recommendations for reading. The Wikipedia article on UML is sufficient for my tastes, but I've know people who dove into Martin Fowler's books and came away more knowledgeable, so that may help you.

    Typical UML diagram
  6. Can you name the different tiers and responsibilities in an N-tier architecture?
    For what value of N? (I mean, we could have N=1000000 and I wouldn't know -- or if I did know, we might be here all day.) Normally N=3, so we might be talking about presentation, logic, and data tiers. Sometimes we might talk about Entities and others, or we might be considering (mistakenly?) MVC. I think the responsibilities are clear by their names, but if you'd like to discuss further, I'm certainly okay with doing so.

    Reading: As often is the case, Wikipedia provides a good starting point, though certainly it's a topic with enough depth one could read several books about it.

  7. Can you name different measures to guarantee correctness and robustness of data in an architecture?
    I need a little direction here. It seems to me this is a product of many things, and I don't know where to start. For instance, we could say that unit tests and integration tests can go part of the way there. We could talk about validating user input, and that it matches some definition of "looking correct." We could have checks coded and in place between the various systems that make up the architecture. Constraints on the database. I could go on if I were giving myself more time to think about it.

    Because of the open-endedness in this question, there are any number of references. I'd dive into automated testing in its various forms, which when applied to the situation, should get you most of the way there.

  8. Can you name any differences between object-oriented design and component-based design?
    To be honest, this is the first I've heard of component-based design, so no, I can't name the differences. My thoughts would go towards having objects to design around (as in C++) vs. not having objects to design around (as in C).

    As it happens, there may be a reason the term "component-based design" seems new to me: IEEE held the "1st ... workshop" on it not 6 months ago. They could very well be behind the times. Searching with Google also indicates this may be designing from the view of the outside, as in SOA.

    I think the SOLID principles I mentioned above go beyond the availability of objects-proper, so I don't expect to be surprised here. However, I can't offer you any reading advice and without a definitive source from the Google results, I cannot even tell if I'm in the right ballpark.

    Your thoughts are especially encouraged on this topic.

  9. How would you model user authorization, user profiles and permissions in a database?
    I wouldn't typically model the authorization piece in the DB. If I read you correctly, I'm guessing you mean the storage of authorization information in the database, as opposed to the act of authorizing. Under that assumption, I've modeled this situation in just about every way I can imagine. A couple of scenarios:

    a. Under a denormalized scenario, I'd keep a table of permissions and a table of users (which includes authorization information, profile information, and a list of permissions from the users table). This isn't ideal if permissions ever change, and especially not if you're returning a ton of users for the purpose of authorization while the profile information is especially large. In that case you're transferring way more data than you need, and it could result in performance problems. (The extra data transfer may only be a problem with ORM tools, as you could always hand-write the queries to return only what you need. On the other hand, storing of redundant data is a problem if storage space itself is an issue.)

    b. Under a completely normalized scenario, we'd have a table of permissions, a table relating users to permissions, and a table for users. For the sake of cohesion (and potentially optimizing data transfer) we might separate the users table into one for authentication and another for profile, while keeping the relationship with permissions based on user_auth.

    c. Some variation in between the two extremes.

    For reading? For me it's based on experience, and perhaps a couple of database courses in college. I guess just about any book on database design would do. I wouldn't bother trying to understand the formal academic descriptions of database normalization, but if you want to, you can only be better for it (as long as you can recognize the tradeoffs due to extra joins!) Reader suggestions are highly welcome, as always.

  10. How would you model the animal kingdom (with species and their behavior) as a class system?
    This one might deserve a blog post all on its own. It depends: If I'm working in a language with multiple inheritance, I'd use a combination of class hierarchy that follows the animal kingdom along with mixins (which are also inheritance, but with less of a hierarchical attitude) for behavior shared between and among the hierarchy levels. Without multiple inheritance, I'd have to resort to interfaces where available, and composition for actual code reuse where it made sense.

    The short answer though, is that I probably wouldn't implement it as a class system. If I really was working with taxonomy and biological classification, I don't think I'd model the real world with objects. I'd need to look into the subject quite a bit further to tell you how I would do it, but suffice to say I don't think it'd be using objects to match it one-for-one, or even something resembling one-to-one.

    Reading: I wouldn't know where to begin. The SOLID principles will guide you, but I wouldn't think that's all there is to it.

    Map of Disney's Animal Kingdom park

What do you think? Where would your answers differ?

Hey! Why don't you make your life easier and subscribe to the full post or short blurb RSS feed? I'm so confident you'll love my smelly pasta plate wisdom that I'm offering a no-strings-attached, lifetime money back guarantee!


Comments
Leave a comment

these are just 10 questions:(

Posted by muhammad nawaz on Jan 17, 2011 at 12:03 PM UTC - 5 hrs

@Muhammad: If you click on this link, there are more: http://www.codeodor.com/index.cfm/category/Answers... *fixed the link

Posted by Sammy Larbi on Feb 10, 2011 at 01:17 PM UTC - 5 hrs

Ehh ... sorry, the regex broke. Try this one:

http://www.codeodor.com/index.cfm/category/Answers...

Posted by Sammy Larbi on Feb 10, 2011 at 01:18 PM UTC - 5 hrs

I think that the difference between OO and component might be referring to OO / Inheritance of features versus stapling in features via member references to objects that provide those features.

Let
class x
function foo

OO would say to get functionality foo into y, do this
class y (extends x)
function bar

Component design would say
class y
membervar x = x()
function foo
return x.foo()

Anyway, I could be wrong about that.

Eric

Posted by Eric on Jan 06, 2012 at 12:13 AM UTC - 5 hrs

Hey Eric, thanks. Would you explain a little more about what you're saying there? It's not that clear for me. I admit, that's probably my failure, but it would help me understand if you could explain a bit more.

Thanks!

Posted by Sammy Larbi on Jan 09, 2012 at 12:10 PM UTC - 5 hrs

Thank you very much mate. hav an interview day after tomorrow. helped a lot.

Posted by Menol on Feb 28, 2012 at 04:40 PM UTC - 5 hrs

Best wishes, Menol!

Posted by Sammy Larbi on Feb 28, 2012 at 05:02 PM UTC - 5 hrs

What is characteristic, research significance and target of Software Architecture?

Posted by MongHeng Ear on May 03, 2012 at 10:26 AM UTC - 5 hrs

Good one,Thank you very much mate.

Posted by Vectorgab on Oct 01, 2012 at 03:22 AM UTC - 5 hrs

Proponents of object-oriented programming (OOP) maintain that software should be written according to a mental model of the actual or imagined objects it represents. OOP and the related disciplines of object-oriented analysis and object-oriented design focus on modeling real-world[citation needed] interactions and attempting to create "nouns" and "verbs" that can be used in more human-readable ways, ideally by end users as well as by programmers coding for those end users.
Component-based software engineering, by contrast, makes no such assumptions, and instead states that developers should construct software by gluing together prefabricated components - much like in the fields of electronics or mechanics. Some peers[who?] will even talk of modularizing systems as software components as a new programming paradigm.

http://en.wikipedia.org/wiki/Component-based_softw...

Posted by JMan on Oct 22, 2012 at 05:32 AM UTC - 5 hrs

Thank you so much Sammy for these efforts. This would certainly help us. Keep it up! Bless you :-)

Posted by Snehal Masne on Jan 16, 2014 at 10:55 PM UTC - 5 hrs

My pleasure!

Posted by Sammy Larbi on Jan 17, 2014 at 05:07 AM UTC - 5 hrs

Hi There,


This is indeed great! But I think perhaps you are generally referring
Answering the 100 Interview Questions for Software Developers: Technical Design which is getting unsustainable.

I am given an assignment to write code </a> on interpolation search binary search(searching an integer in an ordered list). but I don't have a clear idea about about both of them as I missed the theory class. so can anyone suggest me from where I can get satisfying information about them?
I am so grateful for your blog. Really looking forward to read more.


Kind Regards,
Yash

Posted by Yash on May 07, 2018 at 06:17 AM UTC - 5 hrs

Leave a comment

Leave this field empty
Your Name
Email (not displayed, more info?)
Website

Comment:

Subcribe to this comment thread
Remember my details
Google
Web CodeOdor.com

Me
Picture of me

Topics
.NET (19)
AI/Machine Learning (14)
Answers To 100 Interview Questions (10)
Bioinformatics (2)
Business (1)
C and Cplusplus (6)
cfrails (22)
ColdFusion (78)
Customer Relations (15)
Databases (3)
DRY (18)
DSLs (11)
Future Tech (5)
Games (5)
Groovy/Grails (8)
Hardware (1)
IDEs (9)
Java (38)
JavaScript (4)
Linux (2)
Lisp (1)
Mac OS (4)
Management (15)
MediaServerX (1)
Miscellany (76)
OOAD (37)
Productivity (11)
Programming (168)
Programming Quotables (9)
Rails (31)
Ruby (67)
Save Your Job (58)
scriptaGulous (4)
Software Development Process (23)
TDD (41)
TDDing xorblog (6)
Tools (5)
Web Development (8)
Windows (1)
With (1)
YAGNI (10)

Resources
Agile Manifesto & Principles
Principles Of OOD
ColdFusion
CFUnit
Ruby
Ruby on Rails
JUnit



RSS 2.0: Full Post | Short Blurb
Subscribe by email:

Delivered by FeedBurner