Serving the Quantitative Finance Community

• 1
• 2
• 3
• 4
• 5
• 13

farmer
Topic Author
Posts: 13479
Joined: December 16th, 2002, 7:09 am

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

*******I am working on this essay to fight back against the wave of terrible programmers who are hailed as geniuses and threaten to destroy the world. Comments requested.*******The other day, as always, I asked my friend the exact syntax to write a join query. This rekindled a debate where he has been telling me for years to memorize join syntax such as commas or whatever. Or to remember that the word is "distinct" rather than "unique" to select unique columns one time. The quickest rebuttals I could come up with are that the syntax is slightly different between databases, and it is quicker to copy-paste since it avoids typos. I also intentionally do not memorize things, because it uses more brain energy to remember than to copy-paste.But I soon realized this specific debate reveals underlying differences in how problems are solved in programming. It is related to another debate, about my variable naming. My friend prefers standard practice of calling the unique column in a row "id." I prefer literal variable names, and call this column "uniqueinteger." What this reveals is a difference in thinking about patterns of essentially grammar and abstract language objects, versus patterns of lower-level functionality. It extends to the entire debate about when to use libraries like Angular js, and how much to use middleware like Java Fusion.The goal of programming is to make patterns of symbols and operators which are isomorphous with the objects in the real world the program deals with. We want to separate out everything that is the same between programs, such as having a users table with email address and password, and an interface where you create, update, and select according to them. The new code we have to write for each new application is very little. (I once observed 20 years ago, that everyone in my office was basically taking in data in one format and sending it back out in another format, and requesting or sending bits to coworkers. I wondered if I could abstract this to a single AI program.) What this leads to is very elegant and abstract language patterns, that get translated through a black box of libraries and hardware, and produce the desired functionality.There are many problems with this. First of all, are all programs really the same? In fact, even one program is not the same over time. It may run on a faster or slower network, so that the "same" code stops working. It may need a new type of encryption to send the same piece of data. The many parts of a program that the programmer is insulated from, are faced with what Fred Brooks called "irreducible complexity" that varies over space and time, even in the same program. The question is, does insulating the primary application programmer from solving these problems - and then hiring the kind of freak best suited to the narrower task he is faced with - deliver working applications faster? I believe it often does not.Particularly in the case of new applications, but definitely in maintaining all applications, the primary problems which will have to be solved will exist in this gray area, outside the core business model or functionality expressed in the top set of symbols. Simplifying the core task with middleware creates the mirage that writing a new application has been reduced to a simple problem. But in fact, it has merely hidden the irreducible complexity in unknown files and activities, so that errors become insidious and impossible to debug or understand. So the time spent creating the core business logic may be reduced by 90%, for not having to write document.getElementByID 100 times for each text input. But the time to get the application to work may be extended to infinity. Because you may be out of business before it ever actually works.Many programmers naturally think things like:foreach (i in x){ i.x.spawn(i);}These are what I would call elegant grammar-pattern programmers. As an abstract programming pattern, this works whether x refers to snakes or anything else. The code insulates the user from worrying about how many i there are in x, what is the data type of x, or whatever. Thinking in this way enables you to use templates and all kinds of other high-level programming patterns, which admittedly I do not use. I prefer to program in C rather than C++ or C#, and PHP rather than Java or javascript, and to write something more literal like:$whichsnake = 0;while ($whichsnake < sizeof($snakes)){$thissnake = $snakes[$whichsnake]; print($thissnake);$whichsnake++;}An even lower-level approach without dynamic typing might begin:char snakechars[65535];Why does it matter? A while back I was writing a java socket program to turn http requests into commands sent to devices at multiple locations over rs232. Given that I wanted a separate thread to handle traffic with each device, I decided to make an array of processes. I asked out loud "How many locations with these devices are we ever likely to have?" A very elegant programmer said make the code much simpler, just foreach through the rows of device descriptions from the database table or config file, and spawn a new thread in each loop. This will work no matter how many device locations there get to be. Let the program worry about allocating memory, use typeless collections for the messages, and so on.But what happens when you abstract the business logic so much that you let the platform worry about allocating the memory and how many devices there actually are? It turns out there was a major problem with memory allocation, which the person writing the business logic could not detect or fix. If there is a separate admin running the Java middleware, you have to email him to request the initial and maximum memory allocation. And then you have to write a debug output, which can at best output snapshots of the memory use at a single moment. But even then, output to where? If the end user is reporting problems, you don't know if it is running out of memory or if the server CPU is overloaded, and you don't even have authorization to go on the server and analyze loads.There was a program for printing contracts. Not launching the space shuttle, but simply inserting names and other things into prepared text, and printing it. The program was written so elegantly, and so abstractly, all the document creation was handled by clever libraries. There was obviously no room to check how many file handles were open on the server, or how much memory each printing process consumed. Fonts were missing or replaced, documents took 30 minutes to come out of the printer. I don't know how long they tried, but in short the program never worked on the servers the company used to print their documents. A lot of time was saved not writing code to design documents at a low level. But the program never worked. You could say at least they gave up quickly. But the point is, the core business logic progammer was insulated from allocating memory, CPU usage, and file handles. And for that reason the bugs were not fixable, and a simple printing program never worked or ever could.You might say I am not an expert socket programmer, because I cannot tell you the arguments in any socket function, or the data structures for ip address and port and such. Even after a two-year period during which every program I wrote parsed live socket feeds using sendto, send, recv, and recvfrom, I could not tell you the arguments in those functions or their order in the seven or eight languages and socket libraries where I used them. I also used strstr in C, mb_strpos in php, IndexOf in C#, and indexOf in javascript and Java, to parse the arrays from the socket functions a dozen times each day. But I still search Google every time I use these functions, to see what order the arguments are, and whether the I is capitalized or how strstr is even spelled.Why does it matter? Because the order of arguments is irrelevant to what the function actually does. And people who are talented to memorize argument orders may seem like good programmers. But people who think about programs in abstract patterns of words, rather than patterns of functionality, cannot solve some problems as well. Someone who says he knows PHP, but does not know Perl, will not be able to make programs work in any language. He will produce nothing for days. Because he is thinking about the words being used, rather than what the program is doing. The words are designed to make machine activities accessible to programmers who think in patterns of words. And in doing so,they abstract away what may turn out to be irreducible complexity.Last week, I added two variables to a C program running on an embedded processor. The variables are sent as strings over a websocket, for a calibration UI in a web browser. This week, they stopped showing up in the browser at random. There was no difference in the functions and lines of code used to send them:LOAD_STRING( varname_percfull1 ); VarTm = percFull1; Send_VarTm();LOAD_STRING( varname_percfull2 ); VarTm = percFull2; Send_VarTm();LOAD_STRING( varname_rawCell1 ); VarTm = rawCell1; Send_VarTm();LOAD_STRING( varname_rawCell2 ); VarTm = rawCell2; Send_VarTm();//printf("rlc11 %f rlc12 %f\n",rawCell1,VarTm);SEND_FLOAT_NAMED( SucSatu1 );SEND_FLOAT_NAMED( SucSatu2 );I uncommented the printf to confirm the program was actually getting there, and the variables had values that would translate into strings. Suddenly they started showing up in the browser. The reason is that printing the debug output to the serial terminal gave extra time for the minimalist ethernet chip to flush up the websocket, without overloading. Whether the program worked or not had no correlation to patterns of words at an abstract level. So someone who thinks about sets of words as stand-ins for machine activities - even in clever and elegant ways - would not be able to solve this problem in 10 years. But somebody who thinks about sets of machine activities would understand instantly.Another problem with people who have talent for elegant templates and iteration loops and object inheritance, is their code will be impenetrable to people who are not such narrow freaks. A while back, a guy with a masters in organic science had to work on some code to control a machine. This was necessary, as is often the case, because he had specific domain knowledge. But he was completely roablocked by a conditional else statement. You know, the one with the question mark and the colon. This is a very neat bit of grammar, right? But I am not sure how it gets projects working or debugged faster. The same thing goes for Angular js. It is a piece of crap that can be used in only the most limited cases in any sane way, but is loved by elegance freaks.There is a program for processing credit cards. It is one of many examples of middleware being undebuggable, and hopeless for simple tasks. It uses a deprecated Java library to maintain a pool of database connections. Over time, the connections turn into unworking "zombies." Cashiers at the company's many retail locations have two swipe the card a second time. Eventually the server has to be bounced. We are talking about writing credit-card transactions to a database, not detecting alien life. The program exposed a simple web API to any programmer who wanted to produce a new user interface for the cashier. But below that layer, it had so many layers of objects and templates in so many hundreds of files, nobody who looked at it could penetrate it after days. Nobody knew the outdated Java connection library. And the whole program depended on the library in a way that nobody could untangle. This has been going on for enough years, that you can fairly say their program will never work.But whoever wrote it was an extremely clever programmer! My ultimate recommendation is to resist hiring programmers who are lingustic circus acts. Because their stuff doesn't work and is impossible to work on.
Last edited by farmer on April 1st, 2016, 10:00 pm, edited 1 time in total.

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteBut whoever wrote it was an extremely clever programmer! My ultimate recommendation is to resist hiring programmers who are lingustic circus acts. Because their stuff doesn't work and is impossible to work on.I recognise this issue. Especially in teams. And a bit of a pain at times ..Is this problem caused by nurture or nature? On the one hand, traditionally CS education is a kind of applied linguistics and has not developed the tools to design industrial application (interesting to see how many CS educations talk about software maintenance). CS is not a branch of engineering.Then in the case of C++, communication tends to be at the level of linguistics. I recently attended a C++ Meetup in Amsterdam on C++17 etc. The evening was devoted to 'const l-value assignment operator'.. It was like being in the Tower of Babel. Can you let them loose on the customers?Sapir/Whorf kicks when C++ is a language that is difficult to use for architectural design. What then happens is irrelevant discussion and a flight to syntax etc.See the thread on Modules.
Last edited by Cuchulainn on April 4th, 2016, 10:00 pm, edited 1 time in total.
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl

Posts: 23951
Joined: September 20th, 2002, 8:30 pm

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

Good essay!Many programmers are artists of the arcane that love to find "clever" code bits which, in turn, are the worst combination of inscrutable and fragile. Avoid programmers who like trivia contests or who claim to speak Klingon!The issue with irreducible complexity is in the irreversible choices made in taking the full system and finding some structured decomposition or simple representation of the system. Once you make a system simple, you lock out a lot of possible directions for expansion and maintenance. Moreover, although all those layers and libraries may hide unnecessary complexity, they also conceal a lot of failure modes like the ones you cite with memory allocation problems, saturated hardware, and Byzantine silent errors. I've seen too much sh*t like that, too. My favorite was a piece of code that occasionally returned a negative number from a square root function!One quibble: making the patterns of symbols and operators isomorphous with the objects in the real world the program is not the goal. In fact it is less than half the goal. It may be true that most of the memory and a lot of the code is for such representations of real world objects. But the true goal for programs in accomplishing actions on those objects. Code is more about managing purposeful changes in state rather than the static states themselves. Verbs matter more than nouns! Clearly, both must be correct yet I find the noun-view more error prone because it's too easy to think of a single concrete anecdotal version of the object and miss all the dimensions of variation, corner cases, and degenerate instances of the object.P.S. I fear I'm worse than one of those elegant grammar pattern programmers. Loops are for losers! I'd much rather have a programming language that lets me write Container_y = Item_f(Container_x) and have it automagically run Item_f on each element in Container_x.

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteP.S. I fear I'm worse than one of those elegant grammar pattern programmers. Loops are for losers! I'd much rather have a programming language that lets me write Container_y = Item_f(Container_x) and have it automagically run Item_f on each element in Container_x. This idiom works for a certain class of problems only. It is called a map in functional programming.But with numerical linear algebra, for example, we need indexing operators. I don't see any other way to get the cognitive gap to maths as small as possible. QuoteOne quibble: making the patterns of symbols and operators isomorphous with the objects in the real world the program is not the goalBut it could be.A C++ CAD package is a good example of OOP. (Rene Descartes formalized geometry, no discussion possible).
Last edited by Cuchulainn on April 5th, 2016, 10:00 pm, edited 1 time in total.
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl

Posts: 23951
Joined: September 20th, 2002, 8:30 pm

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteOriginally posted by: CuchulainnQuoteP.S. I fear I'm worse than one of those elegant grammar pattern programmers. Loops are for losers! I'd much rather have a programming language that lets me write Container_y = Item_f(Container_x) and have it automagically run Item_f on each element in Container_x. This idiom works for a certain class of problems only. It is called a map in functional programming.But with numerical linear algebra, for example, we need indexing operators. I don't see any other way to get the cognitive gap to maths as small as possible. You are right about the first point.What bothers me about loops is that usually, they express an unnecessary constraint and added complexity. In many cases, what gets done to item #0 of a container is entirely independent of what happens for items #1, #2, etc. The order does not matter but the use of loops forces the programmer (and the computer) to think it does. There's no reason for the programmer to have to define the artificial constraint of starting at index 0 and progressing sequentially.But I'm not so sure about the second one. APL is awesome for linear algebra and one rarely needs to use indexing operators, especially for linear algebra. One can even do FDM on a regular grid without ever using indexing operators simply by using array-shift operators to align elements to their various neighbors.Indexing only becomes needed if the computation at index i really is a function of the output of the computation at index i-1 although in some cases (e.g., accumulating the sum in a Monte Carlo random walk) there are special operators that handle simple sequential relationships.QuoteQuoteOne quibble: making the patterns of symbols and operators isomorphous with the objects in the real world the program is not the goalBut it could be.A C++ CAD package is a good example of OOP. (Rene Descartes formalized geometry, no discussion possible).Descarte may have described the objects, but did formalize all the possible manipulations of objects such as rotating any figure about any axis, creating new figures based on conjunctions or disjunctions of other figures, constraining one figure to connect to another, creating arrays of replicated objects, etc.Done poorly, a CAD system is just a drawing program for plopping a set of static objects on a piece of paper. Done right , a CAD system is a tool for construction and simulated motion of objects. When I did CAD work, I used the software to compute feasible and optimal solutions rather than merely store a copy of the object That I wanted.

Posts: 23951
Joined: September 20th, 2002, 8:30 pm

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteOriginally posted by: CuchulainnA C++ CAD package is a good example of OOP. (Rene Descartes formalized geometry, no discussion possible).Descartes would probably insist that circles, ellipses, parabolas, and hyperbolas are all types (subclasses) of conic sections. And he'd be right at the level of nouns in that a single mathematical structure can represent all four types through various constraints or subsets of the values of the parameters.It's only when we bring in verbs that we shatter any hope of a nice OOP hierarchy with circles, ellipses, parabolas, and hyperbolas. We can flatten or lengthen ellipses, parabolas, and hyperbolas but what does that mean for a circle? We can change the radius of a circle but what does than mean for an ellipse which has two radii? We can move the corners of the bounding box of a circle or ellipse but not a parabola or hyperbola. We can center parabolas and hyperbolas along one axis but not the other. We can move the asymptote of a hyperbola but that action is meaningless for the other three figures. Each of the four figure types has a disjoint set of admissible, intuitive operations (verbs).

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteOriginally posted by: Traden4AlphaQuoteOriginally posted by: CuchulainnA C++ CAD package is a good example of OOP. (Rene Descartes formalized geometry, no discussion possible).Descartes would probably insist that circles, ellipses, parabolas, and hyperbolas are all types (subclasses) of conic sections. And he'd be right at the level of nouns in that a single mathematical structure can represent all four types through various constraints or subsets of the values of the parameters.It's only when we bring in verbs that we shatter any hope of a nice OOP hierarchy with circles, ellipses, parabolas, and hyperbolas. We can flatten or lengthen ellipses, parabolas, and hyperbolas but what does that mean for a circle? We can change the radius of a circle but what does than mean for an ellipse which has two radii? We can move the corners of the bounding box of a circle or ellipse but not a parabola or hyperbola. We can center parabolas and hyperbolas along one axis but not the other. We can move the asymptote of a hyperbola but that action is meaningless for the other three figures. Each of the four figure types has a disjoint set of admissible, intuitive operations (verbs).Hyerbolae and parabaolae are not so well-known in CAD AFAIK. Operations on shapes can be homogenized in OOP (e.g. throw an exception for the area of a parabola). More interesting (e.g. in GE/Smallworld Magik) is to define mixins. MagikAnd the Smallworld guys were very successful.
Last edited by Cuchulainn on April 7th, 2016, 10:00 pm, edited 1 time in total.
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteWhat bothers me about loops is that usually, they express an unnecessary constraint and added complexity. In many cases, what gets done to item #0 of a container is entirely independent of what happens for items #1, #2, etc. The order does not matter but the use of loops forces the programmer (and the computer) to think it does. There's no reason for the programmer to have to define the artificial constraint of starting at index 0 and progressing sequentially.Try solving a two-factor PDE without indexes. I can't do it.QuoteAPL is awesome for linear algebra and one rarely needs to use indexing operators, especially for linear algebra. One can even do FDM on a regular grid without ever using indexing operators simply by using array-shift operators to align elements to their various neighbors.I don't doubt this for a moment. Engineers have been using Fortran for years. (Almost) No one uses APL, certainly not for numerical linear algebra.Does APL appeal to grammarian? When I used APL in the seventies I needed an APL keyboard? Still true?QuoteIndexing only becomes needed if the computation at index i really is a function of the output of the computation at index i-1 although in some cases (e.g., accumulating the sum in a Monte Carlo random walk) there are special operators that handle simple sequential relationships.Indexing is part of mindset. Most people will find it difficult. Just look at how STL is (not) used.We have the world how it is and the world how we would like to have it.
Last edited by Cuchulainn on April 7th, 2016, 10:00 pm, edited 1 time in total.
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl

tagoma
Posts: 18540
Joined: February 21st, 2010, 12:58 pm

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteOriginally posted by: Cuchulainn(Rene Descartes formalized geometry, no discussion possible).haha!
Last edited by tagoma on April 7th, 2016, 10:00 pm, edited 1 time in total.

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

It can get a lot, lot worse in software projects..No two languages are ever sufficiently similar to be considered as representing the same social reality. The worlds in which different societies live are distinct worlds, not merely the same world with different labels attached.Edward Sapir'Language' is not just computer language here. Ever been to meetings with ~ 10 people.
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteOriginally posted by: tagomaQuoteOriginally posted by: Cuchulainn(Rene Descartes formalized geometry, no discussion possible).haha!Ok, then.The above is a conclusion from some monologue interieur. It is an answer to some (unstated) question.What's the question?
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl

Posts: 23951
Joined: September 20th, 2002, 8:30 pm

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteOriginally posted by: CuchulainnQuoteWhat bothers me about loops is that usually, they express an unnecessary constraint and added complexity. In many cases, what gets done to item #0 of a container is entirely independent of what happens for items #1, #2, etc. The order does not matter but the use of loops forces the programmer (and the computer) to think it does. There's no reason for the programmer to have to define the artificial constraint of starting at index 0 and progressing sequentially.Try solving a two-factor PDE without indexes. I can't do it.Hmmm... Tricky! In the context of PDEs, The issue is whether one can write a solution process that only involves neighbors (e.g., i, i+1, i-1, j, j+1, j-1, etc.) perhaps iterated until convergence such as in FDM. If so, non-indexing solutions are possible. Or if the traversal of indices is a simple sequential one, an non-indexing solution may be possible. But if the traversal of the indices is complex and conditional, then APL probably won't work that well.QuoteOriginally posted by: CuchulainnQuoteAPL is awesome for linear algebra and one rarely needs to use indexing operators, especially for linear algebra. One can even do FDM on a regular grid without ever using indexing operators simply by using array-shift operators to align elements to their various neighbors.I don't doubt this for a moment. Engineers have been using Fortran for years. (Almost) No one uses APL, certainly not for numerical linear algebra.Does APL appeal to grammarian? When I used APL in the seventies I needed an APL keyboard? Still true?APL, Lisp, and advanced C, C++, C# and maybe a bunch of other languages appeal to a subset of programmers that can understand and manipulate certain kinds of abstractions.For better or for worse, a language's popularity has less to do with it's elegance, power, or speed in he most erudite circustances, and more to do with whether a high N% of average programmers understand it.And, yes, the keyboard is quite useful although not strictly necessary. It's funny that many human languages have special alphabets that require special keyboards but such amenities are denied programming languages.QuoteOriginally posted by: CuchulainnQuoteIndexing only becomes needed if the computation at index i really is a function of the output of the computation at index i-1 although in some cases (e.g., accumulating the sum in a Monte Carlo random walk) there are special operators that handle simple sequential relationships.Indexing is part of mindset. Most people will find it difficult. Just look at how STL is (not) used.Yes, indexing is a mindset, but is it a good mindset? How many algorithims really REQUIRE the computer to process item 0 before they do anything to item 1 or require item i be processed before item i+1? I fear that many loops merely convert a non-sequential process into a sequential one which then runs poorly in a single thread on today's usually multi-core hardware.(Worse, how many programing erros occur due to 0/1, off-by-1 indexing errors in algorithms that weren't sequential in the first place!?!?!QuoteOriginally posted by: CuchulainnWe have the world how it is and the world how we would like to have it.You are totally right that things are what they are rather than what we wish they were. In the realm of math, the individual can define the proof as they see fit and others will have to accept it (although there may be a delay if the proof is inscurtable). In the realm of computerslanguages, its a consensus process by which the majority might reject an algorithm even if it is correct, fast, and elegant. Human languages depend on humans!

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

QuoteOriginally posted by: Traden4AlphaQuoteOriginally posted by: CuchulainnQuoteWhat bothers me about loops is that usually, they express an unnecessary constraint and added complexity. In many cases, what gets done to item #0 of a container is entirely independent of what happens for items #1, #2, etc. The order does not matter but the use of loops forces the programmer (and the computer) to think it does. There's no reason for the programmer to have to define the artificial constraint of starting at index 0 and progressing sequentially.Try solving a two-factor PDE without indexes. I can't do it.Hmmm... Tricky! In the context of PDEs, The issue is whether one can write a solution process that only involves neighbors (e.g., i, i+1, i-1, j, j+1, j-1, etc.) perhaps iterated until convergence such as in FDM. If so, non-indexing solutions are possible. Or if the traversal of indices is a simple sequential one, an non-indexing solution may be possible. But if the traversal of the indices is complex and conditional, then APL probably won't work that well.The issue is Sapir_Whorf<PDEClassico, FDMClassioc> which force an explicit form for the boundary. About 30 years ago the Sapir_Whorf<LevelSet> was invented.
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl

Polter
Posts: 2526
Joined: April 29th, 2008, 4:55 pm

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

Cuchulainn
Posts: 64298
Joined: July 16th, 2004, 7:38 am
Location: Drosophila melanogaster
Contact:

### Grammar-Pattern Programmers: Is Over-Abstraction Delivering Projects Faster Or Slower?

Quotehttps://atilanevesoncode.wordpress.com/2015/06/08/the-loopers-and-the-algies/I'm speechless.
Last edited by Cuchulainn on April 9th, 2016, 10:00 pm, edited 1 time in total.
"Compatibility means deliberately repeating other people's mistakes."
David Wheeler

http://www.datasimfinancial.com
http://www.datasim.nl