Lorena A. Barba group

Why I push for Python

keep-calm-and-code-python_BW

My colleagues are puzzled by my relentless push of Python as the language to teach programming to our undergraduates. They look at me funny, each time that the subject comes up and I can't help vehemently insisting "Python!"

It's natural to be skeptical of someone championing a programming language; we've all seen the language wars rage foolishly in other contexts—surely it's just a matter of preference? And many of my colleagues prefer Matlab, although some others insist that our undergraduates need to learn C. Does it matter?

Let me articulate my reasons to continue to advocate for Python. First, let's agree on the context of this discussion: I'm talking about a programming language to teach undergraduate students of engineering the computational skills that will make them more successful, both as students and as future STEM professionals.

Most entering freshmen have no programming experience whatsoever. Unfortunately, computer science is all but absent from the school curriculum: in 2011, only 5% of high-schools in the US were certified to teach the computer science AP course and only 0.6% of all AP tests taken were in CS [1].

I'm talking about teaching complete novices their first baby steps of programming, and rather swiftly bringing them to a level of skill where they can use computing in their other courses: to analyze data for those lab reports, to learn linear algebra, to solve problems in particle mechanics, problems involving differential equations, maybe even to write a program to control a robot. And by the way, these students are busy and have a social life and cannot abide courses that seem like a waste of time. Let's also make it fun, then, can we?

A programming language for beginners

What is a programming language? All computers really understand is machine language: instructions operating on binary bits. Programming languages are made for humans. Their goal is to allow humans to express what they want the computer to execute for them, in a way that other humans can understand.

Compare these two programs … which is more human-readable?

First, in C++:

#include <iostream.h>
void main()
{
cout << "Hello world" << endl;
}

Now, in Python (v.2.7):

print "Hello world"

This simplest of code examples is used in the book "How to think like a computer scientist" [2] to explain why Python is good for teaching beginners. In the C++ version, there are too many elements (#include, void, main) that will be confusing for students. Explaining them takes time, can be intimidating for beginners, and serves no purpose in helping students get computing. Jeff Elkner explains in the preface to "How to think…" that the C++ version of the book had 13 paragraphs explaining the "Hello world" program, while the Python version had only two. The 11-paragraph difference dealt not with programming concepts, but with details of C++ syntax. Beginner programmers will just get frustrated by obscure syntax.

Quoting Elkner again…

Using Python has improved the effectiveness of our computer science program for all students … More students leave the course with the ability to create meaningful programs and with the positive attitude toward the experience of programming that this engenders.

From anecdote to data

Analyzing 30 programs written in Java and 30 written in Python by novice programmers (in Finland, aged 16–19), Mannila et al. (2006) studied the errors found in them to identify those that could be attributed to the language. The students in both groups had the same teacher and studied the same contents in the same environment; only the language changed.

The study categorized errors as relating to understanding (logic) or arising from features of the language (syntax). Four criteria were also applied to the programs as a whole: execution, satisfying specs, error handling, and structure.

Of all the syntax errors found, only two appeared in Python programs while 19 were found in the Java programs (missing brackets or semicolons, uninitialized variables, etc.). And the logic errors were also significantly fewer in the Python programs, compared to Java (17 to 40). Also, more Python programs ran correctly and satisfied the specifications, and more included error checking/handling, compared to the Java programs.

A second part of the Mannila et al. study looked at how the students who learned with Python transitioned to a second language in a later course. Critics of Python as a first language often claim that being too simple, it makes students run into problems when having to use a more advanced language later on. But after both analyzing the programs and interviewing the students, Mannilla et al. concluded that students experienced no problems in the transition. (In particular, they had no problem adapting to static typing after having learned to code in Python.)

In conclusion, this study showed that students make fewer syntax and logic errors when learning in Python (compared to Java), and there are no pitfalls when transitioning to a second language. Python makes it easier to focus on giving students a solid ground on computational thinking.

Bonus reasons for Python

Watch the first 5 minutes of this hands-on introduction to Python for beginners, by Jessica McKellar (Director of the Python Software Foundation), to hear several reasons for learning Python:

Quoting Jessica …

  1. Python is a versatile language: you can analyze data, build websites (*), maintain servers, make art or music.
  2. Employers love Python: people will want to hire you.
  3. Python is a great teaching language … a lot of educational institutions are switching to Python, e.g., MIT
  4. It reads very much like English (it has low syntactic overhead)
  5. It is very easy to get useful work done quickly in Python
  6. You can do data analysis and graphing with Matplotlib (even 3D animations)
  7. You can write games on Python (using PyGame)

(*) Websites are build on a Python framework called Django. Examples: Instagram, Firefox, Pinterest, even YouTube!

Continue watching the video from about 8:20 to learn a bit of Python right now! You can type along with Jessica and try the code right on your browser by going to PythonAnywhere.com

Why is it so hard to learn to program?

The well-known computer-science educator Mark Guzdial addressed just this question (Guzdial, 2010). There are many reports of high failure rates in introductory programming courses (worldwide). Why do students find it so hard?

Studying how people use a natural language to describe a task to another human gives clues. In such descriptions, people don’t define iterations, they instead put into words set operations; they are not explicit about loops terminating; people use constraints, event-driven tasks and imperative programming, but they never talk about objects. And when these natural-language instructions are given to other participants, they have no problem following them. Processing a set of data until it's finished is natural, but incrementing an index is not.

How is this related to Python? It so happens that the language's core looping idioms can often replace index manipulation, making it more like plain English. The following examples were given by Raymond Hettinger (core Python developer) in a keynote in 2013. To get the square of the numbers from 0 to 5, you might write Python code like this:

for i in [0, 1, 2, 3, 4, 5]:

print i**2

But the convenient function range() makes it easy to iterate over longer lists.

for i in range(6):

print i**2

This has the disadvantage of creating the list in memory (not good if the list is very big). So in Python 2.7, a better way is with the xrange() function (which in Python 3 dropped the x):

for i in xrange(6):

print i**2

Now, suppose you want to print the colors in a list like this:

colors = ['red', 'green', 'blue', 'yellow']

You might write this to loop over all the colors:

for i in range(len(colors)):

print colors[i]

But Python let's you do this instead, which looks more natural, and like Raymond says, more beautiful:

for color in colors:

print color

In summary, Python is a lot more like English than other programming languages, and reduces the cognitive load in learning to think computationally.

What about Matlab?

I used Matlab for years and I understand why many of my colleagues use it heavily. For many of them, it's awfully hard to imagine their workflow without Matlab. But there are reasons to at least think about switching, and I will let others speak for me here.

Luis Pedro Coelho is a computational biologist at EMBL. In "Why Python is Better than Matlab for Scientific Software," (Oct.'13) he offers these reasons:

 

In "Why use Python for scientific computing" (July'13), Cyrille Rossant, a neuroscience researcher at University College London, offers similar reasons:

 

Almar Klein, a developer and scientist in the Netherlands, has more concrete objections to Matlab in the long "Python vs. Matlab" essay:

"… the most fundamental problem with Matlab is its commercial nature

And cites these other issues:

 

A trio of additional issues brought up by Hoyt Koepke of University of Washington can be extracted from his "10 Reasons Python Rocks for Research," as follows:

And there's more, if you still need more convincing:

 

References

  1. "A National Talent Strategy. Ideas for securing US competitiveness and economic growth," Microsoft white paper, p. 13 (2012) // PDF // See also: CS Education Statistics,
  2. "How to think like a computer scientist. Learning with Python," Allen Downey, Jeff Elkner and Chris Meyers. Green Tea press, 2002 // Free book
  3. Mannilla, L. et al., "What about a simple language? Analyzing the difficulties in learning to program," Computer Science Education, vol. 16(3): 211–227 (2006)
  4. Guzdial, M. (2010). Why is it so hard to learn to program? In Andy Oram and Greg Wilson, editors, Making Software: What Really Works and Why We Believe It, Chapter 7, pp. 111–124. O’Reilly Media, 2010.
  • Eric Wilson

    Jessica's second point "Employers love Python: people will want to hire you." seems a stretch to me. I'm sure there are more Python jobs than some languages, but not nearly the market as Java & C#.

    This is from a Java developer that would love the opportunity to do Python for money.

    • http://lorenabarba.com/ Lorena A. Barba

      Thanks for leaving a comment!

      In the tutorial, she's talking to complete beginners who are not likely to become full-time developers, so I think the point here applies to professionals of other fields (or artists) having programming skills, in addition to their field-centric skills.

      In my world, I extrapolate the statement to engineering students, where Python is probably more marketable with employers than Matlab. Python is used in industry, whereas Matlab is mostly used in universities.

      • Eric Wilson

        OK, that makes sense. All the best in your fight against C & Matlab

      • http://biosport.ucdavis.edu/lab-members/jason-moore Jason K. Moore

        Coming from an engineering prof, I would have expected you to say that Matlab is mostly used in industry, yet you said Python is. Do you have something that backs up that claim with respect to engineering industry?

        • http://lorenabarba.com/ Lorena A. Barba

          I don't have data, sorry. What I said (and it was hearsay) was not specific to _engineering_ industry, but industry in general—and I was thinking of the popularity metrics of programming languages, where Python has been on the rise.
          As far as I know, Matlab is used a lot in a subset of industry (e.g., automotive) where the killer app is Simulink.

    • dbg

      Java and C# are prominently used by large corporate enterprise IT organizations for developing internal business software. There's a pretty steady job market writing that kind of software but its hardly comprehensive. There are a large number of domains where Python is a more common/preferred language. Scientific computing, data analysis and statistics, and server-side web development are the first three that come to mind. That's not to say you can't write good software in those domains with Java or C#. Just that Python is more common.

      Even in the context of enterprise business software, Python is still incredibly useful and desirable to employers. Its one of the most common scripting languages used as "glue code" for managing infrastructure. Most of the enterprise software I've worked on is a mixed system actually. The main application (or applications) might be written in Java, and a dev in this domain certainly should be very comfortable working in Java, but its really important to be familiar with a lot of different technologies.

      • Eric Wilson

        While it is true that Java is the only choice in the large corporate world, I have worked at several small companies that use Java for building web applications. In fact, my experience is that for web development, there are way more Java jobs than Python in web development. (About 10x for an Indeed.com search in my area, and that may be understated because many of the Python listings are jobs where Ruby/Python/Perl are thrown in there for good measure.)

        Scientific computing is certainly a strength of Python, but those jobs are extremely rare. Despite having a PhD in math, I can't find any leads on a scientific computing job.

        As for glue code, yes, of course. I wasn't suggesting that one can't use Python effectively in many jobs, I was speaking to the idea of people wanting to hire you because you know Python. Maybe I'm talking to the wrong recruiters, but I can't find anyone that cares that I can write Python pretty well.

        • Wolf

          I suspect there are more Java and C# jobs as well, but I think most of these jobs are of the somewhat boring, enterprise kinds of software development.

          I know a friend of mine uses Python in a hospital to automatize many parts of the workflows. Jessica points out some nice examples of Python used in practice as well.

          So for job security, sure: learn Java and C#. But for the more interesting jobs, it's advisable to learn other languages which seem to be more appropriate for certain niches.

          • Eric Wilson

            "But for the more interesting jobs, it's advisable to learn other languages which seem to be more appropriate for certain niches."

            That's how I used to think. But I have an interesting Java job now, and I can't find _any_ Python jobs, interesting or otherwise.

            Of course it's advisable to learn other languages in any case. I am skeptical of any experienced Java dev that doesn't know and use any other language. But in my experience that is unrelated to "Employers love Python: people will want to hire you."

    • http://alfredessa.com Alfred Essa

      I lead a team of data scientists, researchers, and developers. Our primary languages are Python and R. Python's ecosystem has amazing momentum with innovations such as iPython, iPython notebook, and Pandas. My team is also responsible for product development in learning analytics. For front-end development we gravitate towards frameworks such as Ember.js and D3 (also Java Script) for data visualizations. With the spike in demand for Analytics I believe Python is emerging as the Queen of programming languages in Data Science.

  • indranil sinharoy

    Nice post! I wasn't aware of the argument that one of the reasons that make Python easier to learn is because its structure is more like a written/spoken language for communication, specifically English. In my own case, I had stayed away from Python as I felt it to be too verbose and felt that I would have to type a lot to do simple things. However, that has changed now, and I have been using Python for the last 2 years. I have also realized the beauty in the language, which is really very elegant and expressive. Just like English (or any other language for written/spoken communication), code written in Python can evoke emotions and feelings. I had never experienced such a thing in C, C++, Matlab or LabVIEW (of course among them there are some that are easier than other). I have also experienced first hand (what many others have already talked about) that ideas translate into code more easily in Python.

    On a different note, it would be very interesting to know about the basic/ general workflow people in science have adopted around the Python ecosystem. I am not talking about the use of specialized packages. Like how people mix both IPython notebook and Sphinx for literate programming. How they use different Python tools from the start of a project or a research idea, to publication and sharing, etc.

  • Misguided Hindus

    PYTHON!

  • Titus Brown

    Lorena, you might also be interested in this paper: http://dl.acm.org/citation.cfm?id=1734437. In summary, my colleagues Bill Punch and Rich Enbody showed that there was no difference in later CS learning if Python was taught before C++.

    • Spaceship goes fast

      Hey! I took CSE 231 at MSU with Punch. Now I code in python all day every day. Imagine that.

    • http://lorenabarba.com/ Lorena A. Barba

      Thanks Titus! ... both for leaving a comment and for the link. I had not seen this paper. Its starting point is also an important one: "one semester of C++ does not provide students with [a useful] problem-solving tool." (I suppose the same thing can be said of bare C.) Yet most non-majors have only one course in programming. This is precisely what concerns me: how do you develop computing skills in non-CS majors so they can be more successful in their studies and careers?

      My personal opinion is that a better way than the one-semester freshman "intro to programming" course is to embed computing throughout the curriculum, across several courses—engineering math, linear algebra, differential equations, mechanics, heat transfer, fluid mechanics, dynamics and vibration ... all these courses could embed computing as part of their problem-solving approaches.

      The paper you mentioned could be particularly useful for my ongoing conversation with colleagues of the robotics branch of MechEng. They tell me that "all our students need C" because they will program microprocessors. I say that learning basic computing skills with Python will prepare them well for algorithmic problem-solving skills, and they'll be ready to learn a second language (and it's a subset of students, not the whole cohort, that go into robotics). But so far I'm not winning that argument.

      • RestfullBull

        There's http://pyrorobotics.com/ which is python for robotics. Might help you in that argument.

        And there's micropython , python on a microcontroller. Not a replacement for c , but can work in some robotics projects, according to author.

  • Fangohr

    Thanks Lorena for a very interesting post, full of insight, pragmatic and effective approaches to teaching programming to students who are not computer scientists.

    I'd like to mention (my own) little report on this from 2004 which looks specifically at C, Matlab and Python as (first) programming languages introduced to engineers at university, which is based on my previous efforts to teach those three languages to engineering students. At the time - that's 10 years ago - the Python eco-system was not as well developed, but the key points for Python were the same: we need to pick a language to teach principles of programming, and we might as well choose one that makes this as easy as possible. By teaching the principles, we enable the students to learn additional languages as and when required during their lifelong learning in their various career paths. Python can do the job of introducing these principles. It so happens that Python in practice goes beyond that by often providing already all the computational/processing/analysis/visualisation power and tools that is required for many tasks in a science and engineering career, and this is increasingly more so as scientific libraries improve and tools like the IPython Notebook become available.

    For completeness, the journal URL for "A Comparison of C, MATLAB, and Python as Teaching Languages in Engineering", Lecture Notes in Computer Science Volume 3039, 2004, pp 1210-1217, is http://link.springer.com/chapter/10.1007%2F978-3-540-25944-2_157 and a free post-print is available from http://eprints.soton.ac.uk/22811/

    • http://lorenabarba.com/ Lorena A. Barba

      Hans, thanks for your comment and for the link. I just read your paper from 2004. It aligns so well with the other materials that I've been reading! As discussed in the paper by Mannilla et al. (2006), beginner programmers make a lot of (frustrating) mistakes with C, like you also observed —incorrect scope for loops or other blocks, syntax errors including braces and semicolons, type errors—. I would have liked to see some metrics in your paper (how many students, did you count errors in a given assignment, etc.)

      You also put your finger on a considerable disadvantage of the Matlab programming style: only one function per file. I remember when I was using Matlab heavily several years ago, and I was doing a *lot* of copy-and-paste. This gets horrendous as your code base grows.

      To think that you wrote this 10 years ago ... at a time when the Python ecosystem was wimpy in comparison. Now we have greatly improved Matplotlib and other stuff like pandas and so on.

  • Snakus Oilus

    Doesn't the fact that indexing starts with 0 instead of 1 in Python negate your core argument that "programming languages are made for humans, not computers"? In the real world, do you seriously count things starting from 0? MATLAB's indexing is far more amenable to the way humans think.

    MATLAB 1 - Python 0.

    • http://lorenabarba.com/ Lorena A. Barba

      Yes, the number system starts at zero. In mathematics, all the equations and formulas that involve indexing start from zero. Polynomials, Taylor series, Fourier series, linear bases, iterative approximation methods, and many other mathematical expressions and methods all have a zeroth-order term.
      Mathematics starts at zero, and the real world too. You may think that you count from one, but in fact zero is always in your counting system: it means there's nothing in your counting set.

      • http://biosport.ucdavis.edu/lab-members/jason-moore Jason K. Moore

        It doesn't matter which index you start with, it only really matters how you design your language for slicing and such. Ondrej Certik has a nice explanation of that here: http://www.fortran90.org/src/faq.html#what-is-the-most-natural-starting-index-for-numbering

        • http://lorenabarba.com/ Lorena A. Barba

          The original commenter, Snakus Oilus, was doubtful that numbering from 0 is more natural, and alluded to counting. Because of that allusion, in my reply I referred to how it's natural in mathematics to start with zero.

          But you bring us back to the more relevant issue: what matters for computer programming. In this case, E. W. Dijkstra explains why numbering should start at zero in this brief note posted on his website:
          http://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD831.html

          I couldn't possibly improve on that.

  • Juanlu001

    Thanks for the wonderful post, full of references and interesting information! The points you raise are exactly those which we're trying to make in my own University - in fact, we developed our own #aeropython in Spain not many months ago, as you noticed :)

    While you are pushing Python "from the top", we're doing the same "from the bottom" - we'll see if we success in showing our classmates the advantages of Python and then make our professors consider alternatives to the well-established, commercial products. Many people were lacking solid programming abilities and they found this language an awesome tool.

    Muchas gracias por compartir todo esto, ¡un saludo lleno de admiración desde el otro lado del océano!

    • http://lorenabarba.com/ Lorena A. Barba

      Gracias a ti por el apoyo!

  • Jack Poulson

    Hi Lorena,

    I was pleasantly surprised to see this pop up on HN!

    Perhaps this is in support of your point, but there are three errors in your C++ hello world that will prevent compilation:
    1) should be
    2) "main" should return an integer status
    3) "cout" and "end" are members of the "std" namespace, so they either need to be prefixed with "std::" or pulled in with a "using" statement.

    On the other hand, in defense of C++, foreach statements are possible as of C++11 and have fairly nice syntax when combined with 'auto'.

  • Rob

    According to http://jakevdp.github.io/blog/2014/05/09/why-python-is-slow/ raw Python is probably not an adequate replacement for Matlab, just based on speed alone on account of its dynamic features. I'm not arguing it couldn't be used, as you can easily bolster Python's number crunching with NumPy or the like, but even then I've heard that Matlab is faster for more involved math (probably on account of higher function call overhead and the fact that things have to move back through Python just to go into NumPy).
    I have personal experience in Python's speed affecting usability; I wrote a little app to query a Google API in Python and 150 queries took 2:30. All fine when you have time to burn, but I'd rather not sit around and wait. My Python solution wasn't great, as I couldn't use map and asyncio wasn't available then, so I ported it to Node.js. Suddenly, 150 queries finished in 45 seconds. Not only that, but the SQLite bindings were nicer and I could indeed use map to do my dirty work in a nicer looking way. So for my little project, it was easier to use another language.

    Also, Python is not fantastic as a teaching language (in my humble opinion, as everyone's computer language "reasons for being better" often are) because although it is interpreted and comes with a comfortable REPL and thus better at teaching the basic concepts of programming, Java is better at teaching Object-Oriented Programming. While I can't say OOP is the end-all and be-all of programming paradigms, it is often instrumental in helping mitigate code copy-and-pasting (and otherwise DRY code), as well as showing programmers how to use statically-typed programming languages. I've found that people who've started with dynamic languages have a harder time adjusting to static languages ("do I really have to type int every time I want to make a number? man, Python was smart enough to do it for me, why can't I just use that?") compared to vice versa ("wait, all I have to do is type `var`? that's cool, but how do I know what's supposed to be in there?"). Again, statically-typed langauges may not be everyone's cup of tea, but they're often useful when working with large code projects and IDEs that understand them.

    However, Python is better than Lua (sans LuaJIT) in terms of raw game programming, I'll say that immediately. Love2D is great for all it can do, but Lua is really just often way too slow. Why does my space-age machine struggle to maintain sixty frames per second with only 1000 objects on screen? Cause Lua can't pump out enough data at a high enough rate. Python can do that and much more. But considering a game written in C or C++, Lua is usually the better pick as strictly a scripting language, because of its really puny dependencies and the ease of use in creating bindings to Lua call-out. Plus, no one really wants to bundle an entire 30MB Python installer with their application when they can just statically compile in a tiny Lua interpreter.

    PS: "colors = ['red', 'green', 'blue', 'yellow'}" should end with a square end bracket :)

    • RestfullBull

      If you want to compete with matlab, you compare it to python +numpy which is quite fast for math.

      • Rob

        Right, exactly; but "flat" Matlab (that is, Matlab with few looping constructs) has been shown to me to be faster than Python+NumPy for intensive calculations. If you want something comfortable and easy to prototype in, Python can be your best friend. But after a little while, you may find yourself outgrowing Python and moving to a domain-specific language. Sometimes you never quite need to make the jump, and that's normal; but I maintain that there's a reason that Matlab exists.

  • http://lorenabarba.com/ Lorena A. Barba

    This post inspired animated debate over at Hacker News:
    https://news.ycombinator.com/item?id=7760870

    The professional bias of HN readers shows, however, as most assumed that the post was about computer science majors—maybe without reading it—rather than engineering majors. (I sensed other bias, too, when the author of the post is referred to as "he," but that's beside the point.) Even in the case of CS majors, though, I know that the success story of Havey Mudd is in part ascribed to switching the intro class to Python …
    http://www.highlandnews.net/business/article_0c6ff937-5d34-5516-920d-0637bdb120ba.html?mode=jqm
    https://twitter.com/Hackbright/status/385433850467205122
    https://twitter.com/ghc/status/385433147136950273

  • manejandodatos

    #manejandodatos I should have learnt Python before - http://www.manejandodatos.es/2013/11/learnt-python

  • http://williammora.com/ William Mora

    Nice post. After reading this article I feel like coding some Python :)

  • Pingback: Why I push for Python :: Lorena A. Barba Group ...

  • Pingback: The Most Popular Coding Language at Top US Universities - StackSocial Blog

  • Nelso Jost

    It is important to realize that Python is NOT a replacement por C/C++, at least not yet (go on, PyPy folks!). Take the example of scientific computing: without NumPy (which is just a bunch of C/Fortran compiled modules) there is no much of a game for pure Python in large data analysis. Take the example of Pygame which is a binding for the great SDL lib (again, compiled in C), or PyQt/PySide, binding for C++ great Qt GUI framework. When programming in Python, 95% of the time you will be relying on some lib coded in C or C++.

    That said, I think this is also why everyone should use Python. Say you have a new software project, what do you do? Start with the requirements: find the right tools for the right jobs. Then again, most of the tools are already created (probably compiled in C/C++). Next step you ask yourself: how are you gonna use those tools/libs? Is there really a need for diving into C/C++, memory management, all of it, just to use those libs? I think that most of the times the answer is a simple NO. Here is when Python come in hand: as far as the next layer of abstraction goes, Python and its great extensibilty features, clean syntax, and dynamic typing, make a hell of a language -- and not just a "glue" one. I really believe that Python is mature enough even for large scale projects. As far as optimization goes, on the project level you will be doing function calls and passing data structures around most of the time -- and Python is just perfect for that.

    Finally, when some tool/lib still does not exists either in Python or the programming world in general, you can always go and create/optimize them on whatever compiled language you like and bring them into the whole Python project as extended libraries. This also enforces the great skill for programmers: compartimentalization.

  • Pingback: Python,美国顶尖大学里最受欢迎的编程入门语言 | 23Seed

  • Kaan Akşit

    I am amazed to read similar thoughts. I feel there are endless opportunities using Python in science.

  • mahdi ouziala

    i am a beginer with python and i had used matlab simulink and i want know how and if there is a library in python that can be used in process control and process modeling