26 May 2013

Everything is a nail

How many times have you rejected someone's idea to use new tool in a (new) project? How many times have you done it without knowing the pros and cons of the tool? Just because you wasn't familiar with it? Why do you use the language / framework / library you use? Because it's best? Sufficient? If you really believe it, read the famous Beating the Averages (or at least the paragraph about The Blub Paradox).

Quiz


Before you expand code snippets, think for a while how would you solve the problem. Just try to estimate the complexity.

Question 1

What's the name of the following method? You know this method. If you don't, you should
public static boolean xxx(String str) {
    int strLen;
    if (str == null || (strLen = str.length()) == 0) {
      return true;
    }
    for (int i = 0; i < strLen; i++) {
      if ((Character.isWhitespace(str.charAt(i)) == false)) {
        return false;
      }
    }
    return true;
  }
How much time did you need to read and understand one of the most common functions?

Question 2

Can you do it better? Can you make this code more readable? Pick any tool you want.
isBlank = all isSpace

Question 3

Search all subdirectories and find all mp3 files greater than 9mb.
find -iname "*.mp3" -size +9M
Tiny academic examples? Maybe. Let's try something bigger and more complex.

Question 4

Write sudoku solver. The following solution is from Manuel Rotter's blog.
:- use_module(library(clpfd)). 

sudoku(Rows) :- 
  append(Rows, Vs), Vs ins 1..9,
  maplist(all_distinct, Rows),
  transpose(Rows, Columns),    
  maplist(all_distinct, Columns),    
  Rows = [A,B,C,D,E,F,G,H,I],    
  blocks(A, B, C), blocks(D, E, F), blocks(G, H, I),    
  maplist(label, Rows).     
 
blocks([], [], []).      
blocks([A,B,C|Bs1], [D,E,F|Bs2], [G,H,I|Bs3]) :-    
  all_distinct([A,B,C,D,E,F,G,H,I]),     
  blocks(Bs1, Bs2, Bs3)
Not a real life examples? No company would ever use such strange languages to make money? Well... they and they do.

Question 5

Something from corpo world. Typical security for web application. Only users with admin role (based on company's ldap) can access the application and only via https. Secondary log in of the same user should terminate his previous session. Each login should create new session id to prevent session fixation attack. Css files should not be protected because of performance.
<ldap-server url="ldap://mycompany.com:389/dc=mycompany,dc=com" />
<ldap-authentication-provider 
                         user-dn-pattern="uid={0},ou=people"
                         group-search-base="ou=groups" />

<http pattern="/css/**" security="none"/>
<http auto-config='true'>
    <form-login login-page='/login.jsp'/>
    <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY" 
                                         requires-channel="https"/>
    <intercept-url pattern="/**" access="ROLE_ADMIN" requires-channel="https"/>

    <session-management>
        <concurrency-control max-sessions="1" />
   </session-management>
</http>
End of quiz. If you have other examples of a language/tool perfectly suited for a specific task, send them to me! Disclosure: prolog and spring examples haven't been tested.

Of course, you can't freely mix languages. Cost of integrating different languages, not designed for it, is rather high. Complicated build process, nonexchangeable data types, different runtimes, bad IDE support and so on. So, before each project, choose your language wisely. Will it cover most of requirements? Will it cover the most time-consuming ones? Then you won't add another language just to write isBlank but at some point it may be worth it. Will you recognize it when you reach that point? Cause when all you have is a hammer...

0 komentarze :

Post a comment