Seeking Feedback: Exploring Programming Language Expertise

3 views
Skip to first unread message

Sukant Hajra

unread,
Jan 17, 2010, 11:27:57 AM1/17/10
to software_cr...@googlegroups.com
Hello everyone,

When I was a student, I found myself looking for a something like what I've
written below. After learning a few languages, I realized that there were some
things I would try to keep in mind when learning a new language.

So recently, I wrote the following, kind of as a note to my previous self.
I've helped spearhead a student mentoring group at one of our local
universities [1], and this kind of discussion might be apropos.

Would you guys mind giving me some feedback? I'm open to all criticisms,
comments, and amendments.

Thanks,
Sukant

[1] http://code.google.com/p/atx-sw-mentors/


----


Exploring Programming Language Expertise
========================================


There's a lot of ambiguity when it comes to qualifying the expertise of a
software developer. Some ambiguity makes sense. Software as a craft has a
sufficient complexity and sprawls across too many domains to rank its
practitioners in a hard order. Furthermore, the dynamic nature of business
affects the perceived value of one type of expertise over another.

However, I feel there might be less ambiguity when we scope the discussion to
programming in a specific language.

What follows may look like a shallow checklist. I want to emphasize that this
list will be by no means complete. My hopes are that such a list might help an
aspiring programmer to think broadly about what to look for when exploring a
language. But I do hope to debase just a hint of the mysticism surrounding the
"expert" programmer.


Design
------

- What motivated the design of the language? Was it object-orientation?
Functional programming (pure or impure)? Code conciseness? Improved
performance? Improved checks for correctness? Portability? How does
the language obtain these goals?

- Have you not just learned basic language syntax, but also idioms and
patterns?

- Is the language old enough to have identifiable anti-patterns? Can you
see which language features or idioms are easily or often abused?


Code Quality
------------

- Have you identified all major checkers outside the compiler/interpretter?
Some "lint" checkers for languages are impressively helpful.

- Can you measure code coverage of tests? This can be helpful to identify
areas of code in need of more testing.

- Have you found automated tools to help assert code consistency? For
instance, source code formatters are helpful. Some languages support
more advanced code cleaners too.

- Have you assessed the popular points of variability in the language
syntax and seen what most people do? Have you settled on a preferred
style?


Support
-------

- Have you read through all the official on-line documentation for the
language? These include quick start guides, tutorials, language
references, and libraries references.

- Have you identified a set of published books to supplement the on-line
material? Good books are priceless; some languages of fortunate to have
the accompaniment of some seminal literature.

- Do you have a plan for keeping up to speed with the language? Good ideas
include

- periodically visiting the official web site

- subscribing to blogs or micro-blogs of major players

- subscribing to RSS feeds or visiting sites posting good articles on
the language

- finding podcasts relating to the language

- subscribing to a mailing list of reasonable volume and relevance if
one exists (mailing lists aren't always a good start for beginners)

- Have you found user communities where this language is discussed? These
include mailing lists, IRC channels, and physical user groups.


Important APIs
--------------

- Have you well-acquainted yourself with all the critical standard
libraries? How about the non-standard ones? How about the major
third-party libaries?

- Needless to say, knowing all the collections libraries is essential.

- What libraries and frameworks can you use to persist data? This can
range from simple serialization to high-level database mappers.

- Are you familiar with multiple levels of concurrency abstractions from
simple locks or message passing to higher-level abstractions?

- Do you have a means to log applications modularly (say with log levels
and multiple log handlers)?

- Does the language facilitate easily internationalization of all the
user-displayed text in an application?


Development
-----------

- What are the arrays of editors and IDEs that support this language? Have
you evaluated a healthy set and chosen one that (if possible or desired)
facilitates

- syntax highlighting

- correctness checking (compilation and test)

- refactoring

- code navigation and inspection

- debugging

- Do you have good tools to profile memory usage?

- Do you have good tools to profile execution time?


Testing
-------

- What is the state of the art of testing frameworks for this language?

- Is there a test runner sophisticated enough to fail fast to give
programmers instant feedback on tests?

- Does the language benefit from a mocking library or is mocking supported
directly by language features or idioms?

- Are there design anti-patterns that can lead to difficulties testing?

- Do you have plan to set up a continuous integration/build with this
language?


Build/Deploy
------------

- Does the language support the packaging of code into an artifact that's
easily deployed?

- Do you know how to successfully deploy an application to as many
platforms as the language supports? For instance, can you install and
configure an application in light of all the different conventions for
file/folder location and naming. Also, will your deployment in any way
interfere with any pre-existing package management systems?

- What tools support the build and/or deployment of applications coded in
this language? Do these tools merely manage task dependencies? Or do
these tools help templatize the entire lifecycle of the project (clean,
compile, test, deploy, etc)?

Esko Luontola

unread,
Jan 18, 2010, 7:29:11 PM1/18/10
to software_craftsmanship
Here are some things that I like to find out about a new language:

- Are variables passed by value/reference/"it depends"? In what order
are classes loaded and variables initialized?

- What kind of assembly or bytecode instructions are the language
constructs compiled into?

- What do the objects look like in memory? How are the built-in
datatypes implemented?

- What is the language's concurrency memory model?

- How does the runtime environment work? For example, which GC
algorithms are used and which optimizations the compiler/JIT does?

- Is it possible to do reflection? How about runtime code manipulation
and AOP? How is dynamic class loading implemented and how can you
abuse it?

Pierre Rosado

unread,
Feb 12, 2010, 10:09:15 AM2/12/10
to software_cr...@googlegroups.com
Hi Sukant and Esko,

This is an excellent idea! I think that having lists of this kind would not only help to learn a new language but also to compare them.

Does anyone know a web page or wiki with similar lists?

If there is not any, It would be wonderful to have a wiki dedicated to answers the questions and providing references for any language out there.

What do you think?

------------------
Pierre Rosado


--
You received this message because you are subscribed to the Google Groups "software_craftsmanship" group.
To post to this group, send email to software_cr...@googlegroups.com.
To unsubscribe from this group, send email to software_craftsma...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/software_craftsmanship?hl=en.




Enrique Comba Riepenhausen

unread,
Feb 12, 2010, 5:44:21 PM2/12/10
to software_cr...@googlegroups.com
Hey all,

a perfect place to start would be in http://wiki.softwarecraftsmanship.org

It would be great to see other peoples input and interest in creating a common place to share knowledge about our craft.

Cheers,

Enrique

Sukant Hajra

unread,
Feb 16, 2010, 6:22:49 PM2/16/10
to software_cr...@googlegroups.com
Excerpts from Enrique Comba's message of Fri Feb 12 16:44:21 -0600 2010:

>
> a perfect place to start would be in http://wiki.softwarecraftsmanship.org
>
> It would be great to see other peoples input and interest in creating a
> common place to share knowledge about our craft.

Actually, I ended up putting the page on the wiki for the local student
mentorship organization I work with (ASM) [1,2].

[1] http://code.google.com/p/atx-sw-mentors/wiki/LearningNewLanaguages
[2] http://code.google.com/p/atx-sw-mentors/wiki

On that note, would you guys mind having a look at another page I put up for
students? It's a glossary of the alien terms I didn't know anything about when
I graduated from school [3]. I whipped it up today, and I'm sure there's good
things I missed. I haven't seen if Google Code has ACLs to make wiki pages
writable by the general public, so just reply back to this thread (or me
personally) with whatever you've got.

[3] http://code.google.com/p/atx-sw-mentors/wiki/SoftwareDevGlossary

I see student mentorship programs as well coupled to software craftsmanship
initiatives.

Clearly things like conferences and this list help connect people on a global
level, but at the local level, I haven't see people getting together under the
mantle of SC; rather I see people meeting for either technologies or specific
development processes like Agile/Scrum or Lean.

I'm thinking it would be cool if there were a nice transition from student SC
groups, to local meet-up groups for professionals, to global groups (like what
you guys have here).

-Sukant

Reply all
Reply to author
Forward
0 new messages