The most effective program is Gilian Mikes

This post is part of the Teachers Certification Map’s “lessons from the field”, a series of posts featuring passionate, inspiring educators from across the country discussing some of the lessons that they have learned over the years that would help young teachers as they embark on their careers.

Gilian Isles used to teach Biology to high school students but then shifted to teaching English as a second language to students ages 16 and above. She teaches in Saudi Arabia but has students of different nationalities. Most of the students are Saudis the rest: Egyptians, Indians, Eritreans, Saudi-Indonesians/Chinese/ Indians, Jordanians, Palestinians, Syrians etc.

Below is our interview with Gillian:

How long have you been teaching?

I’ve been teaching for four years now. I started teaching after graduation, that is year 2005. I tried to work in another field before. I worked as a secretary but then I felt bored and paralyzed. It’s like I wasn’t doing what I was supposed to do so I returned to teaching.

What inspired you to teach?

Changed lives. I think I can sum it up to those two words. I am stirred up whenever I see a person’s life change because he/she has learned something that motivated him/her to do better. I believe God has given some the gift of teaching. The ability to give simple explanations to complex ones.

What classroom methods are most helpful in pushing students towards their goals?

Well, I always trigger their interest. I always ask myself “What’s something interesting in this topic that will make them listen and focus?”. After that, I use technology to complete my plan. I use videos, power point presentations, activities, photos, interesting stories etc.

In my case, I have students of different cultures. I am an Asian and most of them are really interested in knowing each other’s culture. So, I let students speak of their country. In this way, you motivate them to talk and others to listen.

What is the one thing you wish you’d known when you started in the classroom?

Arabic. How I wish I had mastered their language. I think it is a must to learn the language before teaching in another country. Well, it’s not required but It’ll be a lot of fun knowing the language. There would be times wherein my students would be surprised because I can understand what they were talking about.

What did your training teach you that was most helpful in preparing you to enjoy and thrive in a classroom today?

I’ve attended seminars in education before and I see to it that I apply the helpful ones. Honestly, everything is like a learning experience for me. I learn the different techniques as I teach. I think every teacher should evaluate her performance as a self-check to know if today’s style was effective or not. If it was effective, I ask myself how I can enhance it. If it wasn’t, then I ask myself what must be done next time. In this way, improvement happens as a daily basis in my teaching career.

If you do not have a masters in education:

I graduated as a BS Biology Major in Applied Biology student in Philippines but most of my outlets and activities were all related to English and journalism. So I was more inclined to teaching English rather than my course. After graduation, I went back to my family who has been living in Saudi Arabia for almost 10 years. Teaching English is an in demand job here in K.S.A. I wanted to take English courses but I couldn’t find a University that would fit my time and budget.

What skills could more developed if you were to enroll in a teacher training program?

I believe I could learn a lot in if I enroll in a teacher training program. I would love to learn more about classroom management and the latest techniques in teaching. I want to know more about ESL teaching. How to encourage students to speak and read long materials.

Do you know someone with great insights to share with young teachers, or do you want to be considered for an interview? If so, please email us at [email protected]

This is a guest post from our journalist Alex J. Mann.  You can subscribe to his blog hereand follow him on Twitter here.

certificationmap.com

Статья об использовании проектной методики на уроках иностранного языка.

Сомова Наталья Владимировна

преподаватель иностранных языков

Хэхэского университета

город Хэйхэ, КНР

Тема: «Project work is one of the most effective methods to motivate students».

Teaching English as a foreign language has changed tremendously over the past 2 decades. Curricular, teaching methods and teaching materials have been developed to meet the changing needs.

There is no unique answer which method the best is. The teacher has to research and find the best variant for his own students. As for me I consider project method as one of the best for motivating. Projects allow students to apply the knowledge acquired from teachers and books without coping ready made answers, because the tasks set for projects always require fantasy and creativity.

As children grow older the character of project work changes towards involving more library and research work, observation and survey. This has another, no less important function: to develop a habit of self-study, an ability to find and process information, a skill to draw one’s own conclusion. This method gives a huge impulse to their imagination and creativity, without which language learning will always stay purely mechanical and ineffective progress. The complex of techniques aimed at developing all these skills is called “learner-centered” approach and include student involvement and learners’ autonomy.

Some easy projects to use on the first step of working with this method: “Family trees” (students elaborate on their family trees by introducing other branches of the family and adding photographs about them). “Friends across the world” (students write about friends or people they know in their country or other and collect pictures or maps of these countries for the wall display). “Class survey” )students prepare and carry out a class survey about “favorite thing”, find out the most popular pizza popping, soft drinks, ice cream flavor, Sunday afternoon activity or first name of a girl or a boy and so on). “Visitor’s menu” (students plan a menu for a visitor to show a range of their national dishes). “Star” (students collect information and pictures about a famous musician, sportsman or film star and write short paragraphs about them).

Probably the most outstanding types of projects are exercises written by the learners themselves. It’s great to give children the chance both to make their own exercises and do exercises made by their peers. It can be different tasks crossword puzzles, scrambled words, texts with grammar or context mistakes, gap -filling or jigsaw tasks and so on.

Project work can have different configurations. Projects differ in degree to which the teacher and students decide on the nature and sequencing of project- related activities. Structured projects are determined and organized by the teacher in terms of topic, materials, methodology and presentation. Unstructured projects are defined largely by the students themselves and semi-structured are defined and organized in part by the teacher and in part by students.

Projects can also be linked to simulated real- world issues (debate on pros and cons of something). Projects can also be tied to student interests, with or without real – world significance (students plan to visit international airport and make some interviews of international travelers and make video film) .

Projects can differ in data collection techniques and sources of information. Research projects -gathering^ information through library research. Text projects involve encounters with texts (e.g. literature, reports, news media, video and audio material computer-based information).

Correspondence projects require communication with individuals (or businesses, governmental agencies, schools or information by means of letters ,faxes, phone calls or e-mails).

Survey projects entail creating a survey instrument and then collecting and analyzing data from informants.

Encounter projects result in face to face contact with guest speakers or individuals out of the classroom.

Projects may also differ in the way that information is reported as part of a culminating activity .Production projects involve the creation of bulletin board displays, videos, radio programs, poster session, written reports, photo essays, letters, handbooks, brochures, banquet menus and what not.

Performance projects can take shape as staged debates oral presentations, theatrical performances, food fares or fashion shows. My students like this kind of presentation and always have a success. We often show our final presentations to younger students and to other classes.

Organizational projects entail the planning and formation of a club, conversation table or conversation partner program.

Project work requires multiple stages of development to succeed. You can follow such steps.

Step 1. students and instructor agree on the theme for the project.

Step 2. Student and instructor determine the final outcome.

. They can choose from a variety of options including a written report, letter, poster or bulletin board display, debate oral presentation , information packet, handbook, newspaper or video. I have a lot of posters, letters, written reports and many other things made by my pupils.

Step 3. Students and teacher structure the project. After students have determined the starting and end points of it, they need to structure the “body” of the project. They should answer the questions: what information is needed? How this information be obtained ?(library search, interviews, videos, internet). How this information be gathered, compiled and analyzed? What role does each student play in the project .In a group one child may be a good “ideas generator”, another more talented artistically. As a result everybody will benefit from the share responsibility. Leaner-centered approach , which has become a buzzword of our profession plays an immense role in project work.

.It’s a brilliant idea to make a mixed ability class a laboratory where all types of students are contributing in creating a new result by their combined efforts.

Step 4. instructor prepares students for the language demands of information gathering. For example , students are going to collect information by means of interviews I must give them some exercises on question formation, introduce conversational formulas, time for role plays to provide feedback on pronunciation and to allow students to practice listening and note- taking or audio- taping. If they want to use library I try to practice skimming and note taking with samples of texts.

Step 5. Students gather information.

Step 6. Teacher prepares students for the language demands of compiling and analyzing data. I do some sessions in which students organize sets of material, evaluate, analyze and interpret them. I advice them to use different kinds of grids, charts that might highlight relationships among ideas.

Step 7. Students compile and analyze information.

Step 8. Instructor prepares students for the language demands of the culminating activity. Here I do different language improvement activities to help students succeed with presentation of their final products.(I have a lot of them and use a lot so that to motivate my pupils and make lessons more productive. I’ll share with some of them later.)

Step 9. Students present their final product.

Step 10. Students evaluate the projects.

As for me, to tell the truth it’s too difficult to evaluate my kids. Should I access the idea, the artistic quality of the poster or the correctness of the text? From my point of view teacher should avoid marking that sort of student’s performance. Usually I apply the so- called peer assessment. Children assess themselves insight the group they worked and the rest of students at final presentation. As for error correction I do it only during the period of working at the task not at the presentation.

Some project work ideas.

“Wall chart: homeless people” children collect pictures and information from magazines or newspapers and make a wall chart. The text books 10,11 by V.P. Kuzovlev will help a lot. “Ecological campaign” students plan (and carry out) a funding raising project to help save some animals or they can make T- shirts with emblems against different kinds of pollution, posters, round tables and what not.

“Sale time” pupils organize a classroom sale with proceeds going to a charity or school fund. They bring to class the items they want to sell and price and display them. All shoppings must be done in English. They can prepare different kinds of ads as well. “One day trip” students imagine they have won tickets to fly on a one day visit to London, New York, Sydney, Tokio or Paris.

“Famous birthplaces” Kids research and write about famous birthplaces of great literary, artistic, religious or political figures and then they can do a book gathering all the pages about famous people.

“Americanisms” students collect “Americanisms” in use in our country (signs, advertisements) for an on-going list that can be kept in the classroom.

“Useful advice for tourists” Children prepare a booklet of useful tips for tourists visiting your country for the first time.]

“Funny captions” students collect pictures of people in unusual situations and then write funny story.

“Portrait gallery” students interview important personalities in their school or college and write short descriptions and biographies of them. It can be typed and displayed together with photographs to help new students become familiar with their surroundings.

“A poem I like” children find a favorite poem in England and bring a verse or 2 to read to class. They can write it out for wall display and find pictures to illustrate it.

“Your ideal café” pupils have been asked by a firm of architects to make suggestion for an ideal café. They decide on the ideal site, décor, the type of food and drink, opening hours, music, etc. And draw up a detailed plan for their café and illustrate if it possible.

“Class recipe book” they compile a class recipe book which they can give to friends or even sell for charity. Some students collect and edit the recipes and others draw sketched or collect pictures to accompany them.

“This month at the cinema” students produce a film magazine in English with one or 2 review sand a list of top ten films with their personal five-star rating. Some students may also to write news flashes about film stars or news or future films.

“Reading survey” students prepare a questionnaire to find out information about books and habits from other people (e.g. in their apartment block, another class, their teachers, their own family or their circle of friends). They can add other questions to find out about favorite authors or favorite childhood books. And others.

In conclusion I want to summarize the importance of project work for successful EFL teaching and learning.

  1. Project work focuses on content learning rather than on specific language targets.

  2. Project work is student- centered , though the teacher plays a major role in offering support and guidance.

  3. Project work is cooperative rather than competitive.

  4. It leads to the integration of skills and processing of information from varied sources, mirroring real life tasks.

  5. It culminates in an end product that can be shared with others.

  6. Project work is potentially motivating, stimulating and challenging.

Список использованной литературы

1.Бабанский К.С. Методы обучения в современной общеобразовательной школе.-Москва: Просвещение, 1985.-213с.

2.Зимняя И.А., Сахаров Т.Е. Проектная методика обучения английскому языку.//Иностранные языки в школе.-1999.-№3-С.9-15.

3.Полат Е.С. Компьютерные телекоммуникации в школе: Пособие для учителя/.-Москва,1995.-218с.

4.Копылова В.В. Методика проектной работы на уроках английского языка.-Москва,2003.-317с.

5.Полат Е.С. Метод проектов на уроках английского языка.// Иностранные языки в школе.-2000.-№2,3-С.17-19,23-24.

6.Phillips D., Burwood S. Project with Your Learners (Primary Resource Books). – Oxford: Oxford University Press, 1999.-365p.

7.Ribe R., Vidal N. Project Work. Step by Step.- Oxford: Heinemann, 1993.-456p.

globuss24.ru

Looking back at my career and life as a programmer, there were plenty of different ways I improved my programming skills – reading code, writing code, reading books, listening to podcasts, watching screencasts and more.

My question is: What is the most effective thing you have done that improved your programming skills? What would you recommend to others that want to improve?

I do expect varied answers here and no single “one size fits all” answer – I would like to know what worked for different people.

locked by yannis♦ Mar 13 ’12 at 20:38

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: help center.

migrated from stackoverflow.com Feb 6 ’11 at 3:55

This question came from our site for professional and enthusiast programmers.

In no specific order…

  • Working with people far smarter than myself

  • Always listening to what others have to say, regardless if they’re junior, intermediate, senior or guru. job title doesn’t mean anything.

  • Learning other frameworks/languages, and seeing how they do things, and compare that to stuff that I already know

  • Reading about patterns, best practices, and then examining my old stuff and applying those patterns where necessary

  • Pair programming

  • Disagreeing with everything Joel says. 😉

Deciding TO be a ‘Jack-of-all-Trades’

Fairly early in my career, I was an expert with a particular database and programming language. Unfortunately, that particular database lost the ‘database wars’, and I discovered that my career options were … limited. After that I consciously decided that I would never let myself become boxed in like that again. So I studied everything I could get my hands on: Windows, Unix, C, C++, Java, C#, Perl, Python, Access, SQL Server, Oracle, Informix, MySQL, etc. Whatever tools and technologies are new or unusual, I became the ‘go-to-guy’ — “Ask Craig, if he doesn’t know it, he’ll learn it.” As a result I’ve worked on all sorts of projects, from embedded systems for environmental telemetry to command and control systems for missile defense.

The only problem I’ve ever had is with companies that insist on pidgeon-holing me into a specialty, when my specialty is being a generalist.

Something to keep in mind … what’s the half-life of knowledge in high tech? It tracks with Moore’s Law: half of everything you know will be obsolete in 18-24 months. An expert who chooses the wrong discipline can easily be undermined by the press of technology; a generalist only has to add some more skills and remember the lessons of the past in applying those skills.

I always thought of my self as a pretty hot-shot programmer. Then a new guy, call him Aaron, was hired into our team. Aaron was obviously much better than me in most areas. He was younger than me, too. He made me realize I hadn’t really improved much in the past years. I was an ad-hoc hacker, and a mediocre one at that.

This alerted me to consciously try to improve myself and especially the quality of code I write.

Aaron lead me to learn a lot of things. He taught me how most of the code I write will have to be maintained and extended for at least several years, so I should write the code with that in mind. I should write automatic tests for my code. Aaron was always talking about how I should never stop at the first working version, but refactor and refine until the code is elegant. I’ve discovered that the languages and tools I was using had a lot of room for improvement.

The most important thing I learned from Aaron was to never stop learning.

After a couple of years, Aaron left the company. I felt empty. The past years with him had lifted me to whole new levels of skill, and I realized I was now much better than the rest of the team. They were still writing bad code, and doing the same mistakes as before. I tried to teach them, but they had no interest to learn. In fact, they were annoyed that someone would be so arrogant to tell them what mistakes they were doing.

So, a few months later, I left the company as well. I moved to a smaller company with a very talented team. Everyone there wanted to learn more, and I loved it.

I’m glad I met Aaron. Without him, I’d probably still be working at the old company with the old gang, going nowhere, and thinking too much of myself.

Two things:

  1. Read code written by different people.
  2. Write documentation for code written by other people.

Writing code is extremely easy; every other person I know can do that. But reading someone else’s code and figuring out what it does was a whole new world to me.

Hit the gym regularly.

Seriously, my brain works a whole lot better when I’m in shape. Problems become easier and less overwhelming, goofing off is much less of a temptation, and working through things step-by-step doesn’t seem like such an arduous task.

Programming. Working on interesting projects. There is NOTHING like getting in and working on stuff. Especially under pressure. I always tell anyone who asks me how to program – just find a cool project (even if you have to make it up) and work on it.

Took a part-time job tutoring CS students at my university. It really forces you to understand something at a completely different level when you have to explain it to someone else.

  1. I’m a big fan of the “learn one programming language every year” system. One year gives you enough time to get past the “okay, I know the syntax, so now I know the language” bias, and forces you to go a little farther and understand what’s beneficial in that language, and program in a style native to that language (By which I mean, you don’t end up writing java applications using Ruby syntax). Each language will change the way you think about programming- I knew how to use recursion, but thinking in recursion didn’t happen until I took a class on prolog (I imagine a functional language like ML would have the same effect).

  2. Start a Pet project. My personal equation for a good pet project is, something you have experience with + something you don’t = app you would find useful. For instance, Migratr (my own caffeinated-weekend-turned-ongoing project) started out as “I know c#, but I’ve never coded against a web API. And I want to move all my photos to Zooomr”. It could just as easily have been “I’ve coded against web API’s before, but I don’t know C#”

Publishing your pet project is an amazing educational experience in itself. Suddenly all the things practically nobody teaches but everybody’s supposed to know (for me it was setting up your own testing system, getting the most out of version control systems, how to pace yourself when nobody else is setting your deadlines, how to interact with your users and how to know when to say “no” to feature requests), all that stuff bubbles to the surface and forces you to self-educate on a level you weren’t before- at least not by idly reading flamewars on dzone about the pros/cons of the “foo” vs “bar” way of doing things.

Doing these two things covers both ends of the spectrum. Learning a new language will make you a better coder. The pet project will make you a better developer:P

Taught myself assembly. Did it on an old 6502 chip when I was 13? 14? Too long ago. But I can’t think of anything that will improve your development more than getting down to the bit level.

Learning assembly gives you insight into the way computers ‘think’ on a fundamentally lower level, and the elegance at this level is surprising… there are no wasted motions, no ‘disposing’ of data. Developing at this level will teach you efficiency and hone your critical thinking and logic skills. It will also cure you of any sloppy habits you have fairly quickly!

The 65xx chip had three registers (the accumulator, X, and Y) and no machine level instructions for multiply or divide. I remember coding a routine to calculate battle damage, looking through the book, and suddenly realizing that I would have to write my own math library. Spent a couple of weeks scribbling 1’s and 0’s all over my notebook, trying to figure out what ‘divide’ and ‘decimal places’ really meant.

I’ve studied C++, pascal, .NET, many others since then… but none of them have taught me as much, intrigued me as much, or left me with the sense of ‘wow’ that assembly on my old commodore did.

Looking back at old things I wrote and realizing just how bad they were.

  • books, not just websites
  • for self-improvement, not just for the latest project
  • about improving your trade, not just about the latest technology
  • read code, not just you are working on.

Just develop the appetite for reading.

Programming.

Seriously, there are books, there are coding katas, there are sites like this, but I believe that the best way to improve as a developer is to work on real project, with real fickle customers with real, ever-changing requirements with real engineering problems. There’s no substitute for experience.

I think the most important thing you can do is make a conscious effort to improve. There’s no single silver bullet, you have to keep looking for new sources of information, new experiences, and more practice.

And the second most important thing, think about what you’re doing, why you’re doing it, and how you can do it better. Same thing with previous projects. Look back at what you’ve done, and how you might do it differently now. Think about what could have been done better, or where you could still improve on it.

I see two great examples of this at work every day. I have one coworker who loves to learn, and wants to be the best developer he can. He’s uses any downtime to read blogs, read books, discuss programming techniques, and ask tons of questions. He’s also very noticeably improved in just the past year. Another coworker does his job, and does it fairly well. But that’s all he does. He sticks with what he knows, doesn’t make much effort to improve, doesn’t work on any projects outside of his existing ones, and after 4 years, he has the exact same skill set and programming ability that he had when I met him.

Many people have suggested writing code. I’d have to say that reading other people’s code is much more beneficial.

The basic things that helped me as a programmer:

  • Learned Touch Typing.
  • Learned to overcome shyness and ask questions.

Typing for a programmer is essential. Everyone has had a “programmer” coworker who typed using exactly two fingers and had to look at the keyboard for everything. Not fun. Learning to touch type give a huge boost to your productivity as a programmer.

And if you don’t ask, no one is gonna tell you.

Contributing to/participating in open-source projects was by far the biggest thing for me.

You can read all the books, code, and open source projects you like, but you need to understand the end-user aspect of software development. You need to step out of the echo chamber. So I’ll address a couple non-technical points that will help your technical career.

  1. Step away from the keyboard and interact with the end-user and see, through their eyes, how they use the software. End users are typically not technical, so they see software as a magical piece of work, while you see software as a logical set of steps. The two worlds are completely different. So what seems easy and logical to you may seem cryptic and intimidating to others.

  2. Test, test, test. A lot of the software I’ve seen in large corporations use test cases. Hell, they use JUnit, xUnit, and all the other unit testing languages out there. But the problem I’ve seen is that most programmers never see what their software looks like in Production. Learn how users (or systems, if these are batch jobs) interact with your application, library, or interface to find out what kind of abhorrent information they throw at it. This will help you generate good test cases and stop assuming your program will always be fed the correct set of data.

Go all out: create your own project, your milestones, your resources, dependencies, requirements, and test plan. It will force you not only to improve your programming skills to operate within specific parameters, but will also serve to highlight exactly where you most need to improve. Make regular updates about your progress, whether through a blog or more formal project updates, so that you can see exactly where you’ve been and where you hope to go.

I think constantly questioning what you are doing is the biggest thing. Never think that your code is perfect, always strive to improve it.

It seems like I’ve had 2 or 3 times when I thought my code was perfect, then realized I had a long way to go.

I guess the biggest thing was when I started seeing my code itself as consumed by other programmers and not a machine. It’s easy to write code your machine can process, but it’s tough writing DRY, understandable code.

And I don’t mean just understanding “What does this line do”, I mean making it trivial to figure out “How does this class fit in with all the other classes” while making the classes interface so well-formed that it’s virtually impossible to misuse it.

They say that 70% of good code is error checking and handling. When I started programming that way, my code got a lot better. Thinking about what can go wrong and then handling it right away has made a huge difference. It feels like doing all that checking is just getting in the way of getting the code up and running, but it shortens the time from start to finish by a factor of 2 to 4.

Just who are these people “they” and where do “they” live?

My coding skill improved a lot when I started wondering before implementing something how am I going to document this thing.

“Thing” here should have all the possible granularity. From the method to the whole product. For instance at the method level it prevents adding a method in the API that doesn’t fit, or is unclear, before actually writing it. And if I really need to implement a method I cannot document (easily), it’s a sign there is a design problem somewhere…

Automatically, the attitude “if I can’t explain it, I don’t write it” filters out bad code and conversely once I know how to document correctly a thing, it becomes simpler and cleaner to implement.

Constantly learn and practice what you learn.

By means of:

  1. Personal Projects: Ever since I started programming I have been doing personal projects. Ranging from little games, image processing, steganography, implementing file type specifications, implementing various protocols from scratch, or implementing various programs over time.

  2. Reading books: I decided to read and follow through various books in my spare time. There are a lot of well written books by experts just sitting around waiting to be read. The depth you can get from a book is unmatched by for example reading various forum posts.

This is usually my chronological order of learning any new technology:

  1. Regularly read good blogs (Atwood, Martin Fowler, etc.), Keep up-to-date with technology news, Follow stuff about interesting new technology. These steps will let me decide if I find anything interesting to further explore.

  2. Read the right book or any other resource to learn for your level (e.g. for beginners if you want to learn design patterns, I would suggest ‘Head First Design Patterns’). I have also specific preferences for books.

  3. Roll out a toy project or two using the thing I learned. I don’t worry about the usefulness of the project. My intention is just to exploit my learning. (e.g. A calculator project for OOP would be fine)

  4. I would see if I could use the stuff at work. (e.g. Though we don’t use subversion at work, I use it as my local repository, I used Ruby for a task which would otherwise be too monotonous, and time consuming)

  5. This is the best part which I think most people miss out. Knowledge sharing sessions.Give a session or two to fellow team members for example. I believe teaching is one of the best ways to really learn the technology. I guarantee your level of understanding of the technology will become multi-fold, whether you audience gets it or not. 🙂

Hack on some open source project for a few months; the larger the better. When you’re interacting with some highly opinionated, geographically diverse people who don’t know you, you can’t help but learn from your mistakes far faster – I think it’s a certain embarassment factor. Plus, if you identify one or two really smart people, then you can glean valuable insight, if not pure knowledge, from them.

Not the answer you’re looking for? Browse other questions tagged self-improvement skills or ask your own question.

softwareengineering.stackexchange.com

Looking back at my career and life as a programmer, there were plenty of different ways I improved my programming skills – reading code, writing code, reading books, listening to podcasts, watching screencasts and more.

My question is: What is the most effective thing you have done that improved your programming skills? What would you recommend to others that want to improve?

I do expect varied answers here and no single “one size fits all” answer – I would like to know what worked for different people.

locked by yannis♦ Mar 13 ’12 at 20:38

This question exists because it has historical significance, but it is not considered a good, on-topic question for this site, so please do not use it as evidence that you can ask similar questions here. This question and its answers are frozen and cannot be changed. More info: help center.

migrated from stackoverflow.com Feb 6 ’11 at 3:55

This question came from our site for professional and enthusiast programmers.

In no specific order…

  • Working with people far smarter than myself

  • Always listening to what others have to say, regardless if they’re junior, intermediate, senior or guru. job title doesn’t mean anything.

  • Learning other frameworks/languages, and seeing how they do things, and compare that to stuff that I already know

  • Reading about patterns, best practices, and then examining my old stuff and applying those patterns where necessary

  • Pair programming

  • Disagreeing with everything Joel says. 😉

Deciding TO be a ‘Jack-of-all-Trades’

Fairly early in my career, I was an expert with a particular database and programming language. Unfortunately, that particular database lost the ‘database wars’, and I discovered that my career options were … limited. After that I consciously decided that I would never let myself become boxed in like that again. So I studied everything I could get my hands on: Windows, Unix, C, C++, Java, C#, Perl, Python, Access, SQL Server, Oracle, Informix, MySQL, etc. Whatever tools and technologies are new or unusual, I became the ‘go-to-guy’ — “Ask Craig, if he doesn’t know it, he’ll learn it.” As a result I’ve worked on all sorts of projects, from embedded systems for environmental telemetry to command and control systems for missile defense.

The only problem I’ve ever had is with companies that insist on pidgeon-holing me into a specialty, when my specialty is being a generalist.

Something to keep in mind … what’s the half-life of knowledge in high tech? It tracks with Moore’s Law: half of everything you know will be obsolete in 18-24 months. An expert who chooses the wrong discipline can easily be undermined by the press of technology; a generalist only has to add some more skills and remember the lessons of the past in applying those skills.

I always thought of my self as a pretty hot-shot programmer. Then a new guy, call him Aaron, was hired into our team. Aaron was obviously much better than me in most areas. He was younger than me, too. He made me realize I hadn’t really improved much in the past years. I was an ad-hoc hacker, and a mediocre one at that.

This alerted me to consciously try to improve myself and especially the quality of code I write.

Aaron lead me to learn a lot of things. He taught me how most of the code I write will have to be maintained and extended for at least several years, so I should write the code with that in mind. I should write automatic tests for my code. Aaron was always talking about how I should never stop at the first working version, but refactor and refine until the code is elegant. I’ve discovered that the languages and tools I was using had a lot of room for improvement.

The most important thing I learned from Aaron was to never stop learning.

After a couple of years, Aaron left the company. I felt empty. The past years with him had lifted me to whole new levels of skill, and I realized I was now much better than the rest of the team. They were still writing bad code, and doing the same mistakes as before. I tried to teach them, but they had no interest to learn. In fact, they were annoyed that someone would be so arrogant to tell them what mistakes they were doing.

So, a few months later, I left the company as well. I moved to a smaller company with a very talented team. Everyone there wanted to learn more, and I loved it.

I’m glad I met Aaron. Without him, I’d probably still be working at the old company with the old gang, going nowhere, and thinking too much of myself.

Two things:

  1. Read code written by different people.
  2. Write documentation for code written by other people.

Writing code is extremely easy; every other person I know can do that. But reading someone else’s code and figuring out what it does was a whole new world to me.

Hit the gym regularly.

Seriously, my brain works a whole lot better when I’m in shape. Problems become easier and less overwhelming, goofing off is much less of a temptation, and working through things step-by-step doesn’t seem like such an arduous task.

Programming. Working on interesting projects. There is NOTHING like getting in and working on stuff. Especially under pressure. I always tell anyone who asks me how to program – just find a cool project (even if you have to make it up) and work on it.

Took a part-time job tutoring CS students at my university. It really forces you to understand something at a completely different level when you have to explain it to someone else.

  1. I’m a big fan of the “learn one programming language every year” system. One year gives you enough time to get past the “okay, I know the syntax, so now I know the language” bias, and forces you to go a little farther and understand what’s beneficial in that language, and program in a style native to that language (By which I mean, you don’t end up writing java applications using Ruby syntax). Each language will change the way you think about programming- I knew how to use recursion, but thinking in recursion didn’t happen until I took a class on prolog (I imagine a functional language like ML would have the same effect).

  2. Start a Pet project. My personal equation for a good pet project is, something you have experience with + something you don’t = app you would find useful. For instance, Migratr (my own caffeinated-weekend-turned-ongoing project) started out as “I know c#, but I’ve never coded against a web API. And I want to move all my photos to Zooomr”. It could just as easily have been “I’ve coded against web API’s before, but I don’t know C#”

Publishing your pet project is an amazing educational experience in itself. Suddenly all the things practically nobody teaches but everybody’s supposed to know (for me it was setting up your own testing system, getting the most out of version control systems, how to pace yourself when nobody else is setting your deadlines, how to interact with your users and how to know when to say “no” to feature requests), all that stuff bubbles to the surface and forces you to self-educate on a level you weren’t before- at least not by idly reading flamewars on dzone about the pros/cons of the “foo” vs “bar” way of doing things.

Doing these two things covers both ends of the spectrum. Learning a new language will make you a better coder. The pet project will make you a better developer:P

Taught myself assembly. Did it on an old 6502 chip when I was 13? 14? Too long ago. But I can’t think of anything that will improve your development more than getting down to the bit level.

Learning assembly gives you insight into the way computers ‘think’ on a fundamentally lower level, and the elegance at this level is surprising… there are no wasted motions, no ‘disposing’ of data. Developing at this level will teach you efficiency and hone your critical thinking and logic skills. It will also cure you of any sloppy habits you have fairly quickly!

The 65xx chip had three registers (the accumulator, X, and Y) and no machine level instructions for multiply or divide. I remember coding a routine to calculate battle damage, looking through the book, and suddenly realizing that I would have to write my own math library. Spent a couple of weeks scribbling 1’s and 0’s all over my notebook, trying to figure out what ‘divide’ and ‘decimal places’ really meant.

I’ve studied C++, pascal, .NET, many others since then… but none of them have taught me as much, intrigued me as much, or left me with the sense of ‘wow’ that assembly on my old commodore did.

Looking back at old things I wrote and realizing just how bad they were.

  • books, not just websites
  • for self-improvement, not just for the latest project
  • about improving your trade, not just about the latest technology
  • read code, not just you are working on.

Just develop the appetite for reading.

Programming.

Seriously, there are books, there are coding katas, there are sites like this, but I believe that the best way to improve as a developer is to work on real project, with real fickle customers with real, ever-changing requirements with real engineering problems. There’s no substitute for experience.

I think the most important thing you can do is make a conscious effort to improve. There’s no single silver bullet, you have to keep looking for new sources of information, new experiences, and more practice.

And the second most important thing, think about what you’re doing, why you’re doing it, and how you can do it better. Same thing with previous projects. Look back at what you’ve done, and how you might do it differently now. Think about what could have been done better, or where you could still improve on it.

I see two great examples of this at work every day. I have one coworker who loves to learn, and wants to be the best developer he can. He’s uses any downtime to read blogs, read books, discuss programming techniques, and ask tons of questions. He’s also very noticeably improved in just the past year. Another coworker does his job, and does it fairly well. But that’s all he does. He sticks with what he knows, doesn’t make much effort to improve, doesn’t work on any projects outside of his existing ones, and after 4 years, he has the exact same skill set and programming ability that he had when I met him.

Many people have suggested writing code. I’d have to say that reading other people’s code is much more beneficial.

The basic things that helped me as a programmer:

  • Learned Touch Typing.
  • Learned to overcome shyness and ask questions.

Typing for a programmer is essential. Everyone has had a “programmer” coworker who typed using exactly two fingers and had to look at the keyboard for everything. Not fun. Learning to touch type give a huge boost to your productivity as a programmer.

And if you don’t ask, no one is gonna tell you.

Contributing to/participating in open-source projects was by far the biggest thing for me.

You can read all the books, code, and open source projects you like, but you need to understand the end-user aspect of software development. You need to step out of the echo chamber. So I’ll address a couple non-technical points that will help your technical career.

  1. Step away from the keyboard and interact with the end-user and see, through their eyes, how they use the software. End users are typically not technical, so they see software as a magical piece of work, while you see software as a logical set of steps. The two worlds are completely different. So what seems easy and logical to you may seem cryptic and intimidating to others.

  2. Test, test, test. A lot of the software I’ve seen in large corporations use test cases. Hell, they use JUnit, xUnit, and all the other unit testing languages out there. But the problem I’ve seen is that most programmers never see what their software looks like in Production. Learn how users (or systems, if these are batch jobs) interact with your application, library, or interface to find out what kind of abhorrent information they throw at it. This will help you generate good test cases and stop assuming your program will always be fed the correct set of data.

Go all out: create your own project, your milestones, your resources, dependencies, requirements, and test plan. It will force you not only to improve your programming skills to operate within specific parameters, but will also serve to highlight exactly where you most need to improve. Make regular updates about your progress, whether through a blog or more formal project updates, so that you can see exactly where you’ve been and where you hope to go.

I think constantly questioning what you are doing is the biggest thing. Never think that your code is perfect, always strive to improve it.

It seems like I’ve had 2 or 3 times when I thought my code was perfect, then realized I had a long way to go.

I guess the biggest thing was when I started seeing my code itself as consumed by other programmers and not a machine. It’s easy to write code your machine can process, but it’s tough writing DRY, understandable code.

And I don’t mean just understanding “What does this line do”, I mean making it trivial to figure out “How does this class fit in with all the other classes” while making the classes interface so well-formed that it’s virtually impossible to misuse it.

They say that 70% of good code is error checking and handling. When I started programming that way, my code got a lot better. Thinking about what can go wrong and then handling it right away has made a huge difference. It feels like doing all that checking is just getting in the way of getting the code up and running, but it shortens the time from start to finish by a factor of 2 to 4.

Just who are these people “they” and where do “they” live?

My coding skill improved a lot when I started wondering before implementing something how am I going to document this thing.

“Thing” here should have all the possible granularity. From the method to the whole product. For instance at the method level it prevents adding a method in the API that doesn’t fit, or is unclear, before actually writing it. And if I really need to implement a method I cannot document (easily), it’s a sign there is a design problem somewhere…

Automatically, the attitude “if I can’t explain it, I don’t write it” filters out bad code and conversely once I know how to document correctly a thing, it becomes simpler and cleaner to implement.

Constantly learn and practice what you learn.

By means of:

  1. Personal Projects: Ever since I started programming I have been doing personal projects. Ranging from little games, image processing, steganography, implementing file type specifications, implementing various protocols from scratch, or implementing various programs over time.

  2. Reading books: I decided to read and follow through various books in my spare time. There are a lot of well written books by experts just sitting around waiting to be read. The depth you can get from a book is unmatched by for example reading various forum posts.

This is usually my chronological order of learning any new technology:

  1. Regularly read good blogs (Atwood, Martin Fowler, etc.), Keep up-to-date with technology news, Follow stuff about interesting new technology. These steps will let me decide if I find anything interesting to further explore.

  2. Read the right book or any other resource to learn for your level (e.g. for beginners if you want to learn design patterns, I would suggest ‘Head First Design Patterns’). I have also specific preferences for books.

  3. Roll out a toy project or two using the thing I learned. I don’t worry about the usefulness of the project. My intention is just to exploit my learning. (e.g. A calculator project for OOP would be fine)

  4. I would see if I could use the stuff at work. (e.g. Though we don’t use subversion at work, I use it as my local repository, I used Ruby for a task which would otherwise be too monotonous, and time consuming)

  5. This is the best part which I think most people miss out. Knowledge sharing sessions.Give a session or two to fellow team members for example. I believe teaching is one of the best ways to really learn the technology. I guarantee your level of understanding of the technology will become multi-fold, whether you audience gets it or not. 🙂

Hack on some open source project for a few months; the larger the better. When you’re interacting with some highly opinionated, geographically diverse people who don’t know you, you can’t help but learn from your mistakes far faster – I think it’s a certain embarassment factor. Plus, if you identify one or two really smart people, then you can glean valuable insight, if not pure knowledge, from them.

Not the answer you’re looking for? Browse other questions tagged self-improvement skills or ask your own question.

softwareengineering.stackexchange.com

Leave a Reply

Your email address will not be published. Required fields are marked *